Джанго, получение данных на другой странице из вида - PullRequest
0 голосов
/ 05 марта 2019

Здравствуйте, я новичок в Django, в настоящее время я работаю над проектом, но я не могу понять, как мне следует что-то делать.

Прямо сейчас я нахожусь на странице

главная / статистика / ID / ЯЗЫК

но внутри этой страницы я хочу кнопку "изменить", после нажатия я хочу перейти к: главная / статистика / ID / ЯЗЫК / редактировать /

Я просто хочу получить те же данные из
home / stats / ID / LANGUAGE снова
, но теперь в home / stats / ID / LANGUAGE / edit /

My view.py:

class StatsView(TemplateView):
    template_name = 'home/stats.html'
    analytics = build('analyticsreporting', 'v4', credentials=credentials)

    def get(self, request, id, language):

        min_date = "2018-12-01"
        date01 = datetime.strptime(min_date, '%Y-%m-%d')
        max_date = "2018-12-31"
        date02 = datetime.strptime(max_date, '%Y-%m-%d')

        print(date01)
        print(date02)

        if request.GET.get('date1'):

            date1 = request.GET.get('date1')
            pol1 = datetime.strptime(date1, '%Y-%m-%d')
            date01 = pol1
            print(date01)

            if request.GET.get('date2'):

                date2 = request.GET.get('date2')
                pol2 = datetime.strptime(date2, '%Y-%m-%d')
                date02 = pol2
                print(date02)

        if request.user.is_authenticated:
            current_user = request.user.id

            result = BlablaAuth.objects.filter(user=request.user)

            if language == 'ALL':

                blabla = Blabla.objects.filter(blabla=id)

                prefix = '/blabla/' + id

                if result and blabla.count() > 0:

                    analytics_result1 = self.analytics.reports().batchGet(
                        body={
    "Google analytics reporting stuff"
                    analytics_result2 = self.analytics.reports().batchGet(
                        body={
    "Google Reporting stuff"

                    return render(request, self.template_name, context={
                        "report1": analytics_result1.execute(),
                        "report2": analytics_result2.execute()
                    })

            else:

                apple = Apple.objects.filter(video=id)

                prefix = '/apple/' + id

                if result and apple.count() > 0:

                    analytics_result1 = self.analytics.reports().batchGet(
                        body={
    "Google reporting analytics stuff"

                    analytics_result2 = self.analytics.reports().batchGet(
                        body={
    "Google reporting analytics stuff"

                    return render(request, self.template_name, context={
                        "report1": analytics_result1.execute(),
                        "report2": analytics_result2.execute()
                    })

Мои urls.py:

from django.conf.urls import url
from django.contrib import admin
from home.views.views import HomeView, StatsView
from .views import views
from django.contrib.auth.decorators import login_required


app_name = "home"
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^stats/(?P<id>[0-9]+)/(?P<language>[a-zA-Z]+)/$',
        login_required(StatsView.as_view()), name='stats'),
    url(r'^stats/(?P<id>[0-9]+)/(?P<language>[a-zA-Z]+)/edit/$',
        StatsView.edit_stats, name='stats_edit'),
    url(r'^$', login_required(HomeView.as_view()), name='home'),
]

Моя кнопка в stats.html:

<button><a href="{% url home:stats_edit auth.blabla.id apple.language %}">Edit</button>

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Предполагая, что ваш вид редактирования будет основан на общем CBV (например, UpdateView), вы можете создать класс Mixin, который имеет метод get_context_data(self, **kwargs) и выполняет все то, что вы сейчас делаете в методе get() вашего TemplateView. Этот метод будет автоматически вызываться вашими TemplateView и UpdateView и добавляет контекст к вашему рендерингу.

class AnalyticsMixin(object):
    analytics = None  # or some default that can be used by all subclasses. 
    #  None is not a good default since it will raise an AttributeError when calling self.analytics.reports()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # all the stuff you do in get() method, using self.request and self.kwargs which are set by the `as_view()` method on the CBV
        request = self.request
        id = self.kwargs.get('id')
        language = self.kwargs.get('language')
        ...
        return context.update({
            "report1": analytics_result1.execute(),
            "report2": analytics_result2.execute()
        })

тогда в ваших взглядах:

class StatsView(AnalyticsMixin, TemplateView):
    template_name = ...
    analytics = ...  # override here or if it depends on the request override in a method

    # remove the get() method unless you do something that's not for both views.
    # e.g. to override self.analytics if credentials depends on request
    def get_context_data(self, **kwargs):
        self.analytics = build('analyticsreporting', 'v4', credentials=self.get_credentials())
        return super().get_context_data(**kwargs)

и для редактирования:

class EditStatsView(AnalyticsMixin, UpdateView):
    template_name = ...
    model = ... # name of model to update
    # here add the form_class for the editing form if you customise it
    # the context will have the form + the data from get_context_data()
0 голосов
/ 05 марта 2019

способ передачи данных между двумя представлениями - сессия.Поддержка Django аутентификации, а также анонимный сеанс.просто сохраните данные в качестве ключа сеанса и извлекайте их, когда вам это нужно.

...