14mble
14mble

Reputation: 119

Django, getting data in different page from view

Hello I am new to Django, I am currently working on a project but I can`t figure out how I should do something.

Right now I am at the page

home/stats/ID/LANGUAGE

but inside this page I want a "edit" button, once clicked I want to go to: home/stats/ID/LANGUAGE/edit/

I just want to get the same data from
home/stats/ID/LANGUAGE again,
but now in 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()
                    })

My 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'),
]

My button in stats.html:

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

Upvotes: 0

Views: 1074

Answers (2)

dirkgroten
dirkgroten

Reputation: 20682

Assuming your edit view will be based on a generic CBV (e.g. UpdateView), you can create a Mixin class that has a method get_context_data(self, **kwargs) and does all the stuff you now do in the get() method of your TemplateView. This method will automatically get called by your TemplateView and UpdateView and add the context to your rendering.

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()
        })

then in your views:

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)

and for your edit view:

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()

Upvotes: 2

biswa1991
biswa1991

Reputation: 546

way to pass data between two view is session . django support authenticate as well as anonymous session. just store the data as session key and retrieve it when ever you need it.

Upvotes: 0

Related Questions