1

我有一个更新视图:

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 但我无法访问 pk 那里..我在做更新吗?我怎样才能在那里传递那个上下文?

4

1 回答 1

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 的实例称为“图片”似乎有点奇怪)。

编辑以重定向到特定的 URL,您可以定义get_success_url

    def get_success_url(self):
        return reverse("user_profile", self.kwargs['pk'], self.kwargs['username'])
于 2014-12-04T10:22:04.227 回答