Django Обновление представления и передачи контекста

У меня есть вид обновления:

class GeneralUserUpdateView(UpdateView):

    model = GeneralUser
    form_class = GeneralUserChangeForm
    template_name = "general_user_change.html"

    def dispatch(self, *args, **kwargs):
        return super(GeneralUserUpdateView, self).dispatch(*args, **kwargs)

    def post(self, request, pk, username):

        self.pk = pk
        self.username = username
        self.gnu = GeneralUser.objects.get(pk=self.pk)
        #form = self.form_class(request.POST, request.FILES)
        return super(GeneralUserUpdateView, self).post(request, pk)

    def form_valid(self, form, *args, **kwargs):
        self.gnu.username = form.cleaned_data['username']
        self.gnu.email = form.cleaned_data['email']
        self.gnu.first_name = form.cleaned_data['first_name']
        self.gnu.last_name = form.cleaned_data['last_name']
        self.gnu.address = form.cleaned_data['address']
        self.gnu.save()

        return redirect("user_profile", self.pk, self.username)

Здесь в этом представлении я хочу передать такой контекст:

context['picture'] = GeneralUser.objects.get(pk=self.pk)

Я пытался получить get_context_data, но я не могу получить доступ к ПК там.. Я делаю обновление правильно?? Как я могу передать этот контекст там??

1 ответ

Решение

Вы не должны переопределять post совсем. Вся эта логика должна происходить в get_context_data,

На самом деле, ни одна из ваших переопределений не нужна. Все, что вы делаете в form_valid будет сделано уже по стандартной форме сохранения. И переопределение dispatch просто называть суперкласс бессмысленно.

Ваше представление должно выглядеть только так, без каких-либо переопределенных методов:

class GeneralUserUpdateView(UpdateView):
    model = GeneralUser
    form_class = GeneralUserChangeForm
    template_name = "general_user_change.html"
    context_object_name = 'picture'

(хотя кажется немного странным, что вы хотите сослаться на экземпляр GeneralUser как "picture").

Изменить, чтобы перенаправить на определенный URL, вы можете определить get_success_url:

    def get_success_url(self):
        return reverse("user_profile", self.kwargs['pk'], self.kwargs['username'])
Другие вопросы по тегам