Alex Pavlov
Alex Pavlov

Reputation: 581

Django. Pass variable from view to template

I want to pass variable appuser to template and I don't understand how to do it. I have tried to use kwargs.update but it still doesn't work.

I have a view:

class CausesView(AjaxFormView):
    appuser = None
    causes = []
    cause_allocation_set = None

    def prepare_request(self, request, *args, **kwargs):
        self.causes = Cause.objects.filter(is_main_cause = True)
        self.appuser = AppUser.get_login_user(request)
        self.cause_allocation_set = set([r.cause_id for r in self.appuser.current_cause_save_point.cause_allocations_list])

    def prepare_context(self, request, context, initial):
        initial.update(
            causes = self.cause_allocation_set,
            appuser = self.appuser,
            )

    def prepare_form(self, request, form):
        form._set_choices("causes", [(r.id, r.title) for r in self.causes])

    def custom_context_data(self, request, **kwargs):
        kwargs.update(
            special_test = "dsf"
        )
        return kwargs

    def process_form(self, request, form):
        data = form.cleaned_data

        try:
            with transaction.atomic():
                if self.cause_allocation_set != set(data.get('causes')):
                    self.appuser.save_causes(data.get('causes'))
        except Exception as e:
            message = "There was an error with saving the data: " + str(e.args)
            return AjaxErrorResponse({'title':"Error", 'message':message})
        return AjaxSuccessResponse('Causes Saved')

And I have a form:

class CauseForm(AjaxForm):
    causes = forms.TypedMultipleChoiceField(label="Select Causes", choices = (), required = False, coerce = int,
                    widget = forms.CheckboxSelectMultiple())

    def clean(self):
        cleaned_data = super(CauseForm, self).clean()
        causes = cleaned_data.get('causes')

        validation_errors = []
        if not causes is None and not len(causes):
            validation_errors.append(forms.ValidationError("At least one Cause is required"))

        if len(validation_errors):
            raise forms.ValidationError(validation_errors)
        return cleaned_data

How can I get variable appuser in temlpate? For example:

{{ appuser.name }}

doesn't work.

Upvotes: 3

Views: 2706

Answers (1)

Sardorbek Imomaliev
Sardorbek Imomaliev

Reputation: 15400

Read How to use get_context_data in django and https://docs.djangoproject.com/en/1.9/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_context_data

Here is example of how you can do this

class CausesView(AjaxFormView):
    ...
    def get_context_data(self, **kwargs):
        context_data = super(CausesView, self).get_context_data(**kwargs)
        context_data['appuser'] = self.appuser
        return context_data

Upvotes: 3

Related Questions