【问题标题】:Django 1.6 UpdateView, losing PK on POSTDjango 1.6 UpdateView,在 POST 上丢失 PK
【发布时间】:2015-06-18 16:33:19
【问题描述】:

我正在尝试为 Django 1.6.1 中的 django.contrib.auth.User 类构建一个 UpdateViewUpdateView 重用创建模板并使用 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')
            ),
        )

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

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

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

    self.helper.form_action = ""
    

    或者明确地说:

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

    【讨论】:

    • 感谢您的回复!添加斜杠确实有效,但我不确定为什么我没有必须将斜杠添加到我的其他应用程序之一的 UpdateView 中,该应用程序基本上执行相同的操作。你有什么想法吗?
    • action="." 表示使用当前目录,/update/5/update//update/5//update/5/ 没有看到你其他应用程序的代码,我无法告诉你为什么它奏效了。
    猜你喜欢
    • 2017-08-03
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2020-04-15
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多