Django 1.6 UpdateView,在POST上丢失PK

时间:2015-06-18 16:33:20

标签: python django

我正在尝试为Django 1.6.1中的UpdateView类构建django.contrib.auth.UserUpdateView重复使用创建模板并使用UpdateForm来编辑不必要的字段。管理员应该使用此UpdateView来更新系统上所有其他用户的用户名和电子邮件。

我可以通过在URL字段中指定用户PK来导航到表单。这意味着我到达一个页面,其中编辑表单填充了PK指定的用户详细信息。但是,当我提交表单时,Django将我带到一个没有用户PK的更新URL,这会抛出404.

# urls.py

url(r'^update/(?P<pk>[\d]+)$', UpdateUserView.as_view(), name='update_user'),

# views.py

class UpdateUserView(UpdateView):
    model = User
    form_class = UpdateForm
    template_name = "create_user.html"
    success_url = reverse_lazy('manage_users')

    def get_context_data(self, **kwargs):
        context = super(UpdateUserView, self).get_context_data(**kwargs)
        instance = None
        user_pk = self.kwargs.get('pk')

        context['submit_name'] = 'Update Order'

        if user_pk:
            instance = get_object_or_404(User, pk=user_pk)

        if self.request.POST:
            context['form'] = UpdateForm(self.request.POST, instance=instance)
        else:
            context['form'] = UpdateForm(instance=instance)
        return context

    def form_valid(self, form):
        context = self.get_context_data()
        form = context['form']

        if form.is_valid():
            return redirect(reverse_lazy('manage_users'))
        else:
            return self.render_to_response(self.get_context_data(form=form))

# forms.py

class UpdateForm(ModelForm):
    class Meta:
        model = User
        fields = ("username","email")

    def __init__(self, *args, **kwargs):
        super(UpdateForm, self).__init__(*args, **kwargs)

        self.helper = FormHelper()
        self.helper.form_class = 'form-create'
        self.helper.form_method = 'post'
        self.helper.form_action = '.'

        self.helper.layout = Layout(
            Fieldset(
                '',
                Field('username', css_class='form-control'),
                Field('email', css_class='form-control'),
            ),
            ButtonHolder(
                Submit('submit', 'Update User')
            ),
        )

1 个答案:

答案 0 :(得分:1)

您正在使用action="."表单,但会从网址中删除主键,因为网址格式没有尾部斜杠。

您可以在网址格式中添加尾部斜杠

/update/(?P<pk>[\d]+)/$

或在表单助手中更改表单的操作:

self.helper.form_action = ""

或明确:

self.helper.form_action = reverse('update_user', args=(self.instance.pk,))