【问题标题】:django user update form not updatingdjango 用户更新表单未更新
【发布时间】:2021-08-21 10:12:45
【问题描述】:

我有一个详细的用户视图,其中有一个用户更新按钮。用户更新表单位于模态框内,为此,我使用FormView ModelFormTbUser。我不明白表单验证是如何工作的,但字段是正确的。当我为用户更新某些内容时,我收到一个错误TbUser with username already exists,这意味着代码不会更新用户,而是尝试添加一个新用户。另外,我想在提交后重定向到user-detail 页面。

views.py

class UserUpdateView(LoginRequiredMixin, SuccessMessageMixin, FormView):
    form_class = UserUpdateForm
    template_name = 'users/modals/user_update_modal.html'
    success_message = "User updated successfully."

    def get_form_kwargs(self):
        kw = super().get_form_kwargs()
        kw['request'] = self.request
        return kw

    def form_valid(self, form):
        obj = form.save(commit=False)
        print(obj.username)
        print('valid')
        TbUser.objects.filter(id=self.request.user.id).update(username=obj.username, real_name=obj.real_name,
                                                              email=obj.email, cellphone=obj.cellphone,
                                                              department=obj.department, role=obj.role)

    def form_invalid(self, form):
        messages.error(self.request, form.errors)
        # Where to redirect here? I want to 

    def get_success_url(self):
        return reverse('user-detail', kwargs={'pk': self.formclass})

forms.py

class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()

    def __init__(self, request, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request
        if request.user.customer:
            self.fields['department'].queryset = TbDepartment.objects.filter(
                customer=request.user.customer)
            self.fields['role'].queryset = TbRole.objects.filter(
                customer=request.user.customer)

    class Meta:
        model = TbUser
        fields = ['username', 'real_name', 'email',
                  'cellphone', 'department', 'role']

urls.py

urlpatterns = [
    path('users-list/', views.UsersListView.as_view(), name='users-list'),
    path('user-detail/<str:pk>/',
         views.UserDetailView.as_view(), name='user-detail'),
    path('tb-user-update-form/<str:pk>/update/',
         views.UserUpdateView.as_view(), name='tb-user-update-form'),
]

【问题讨论】:

  • TbUser是用户模型吗?

标签: python django url django-views django-forms


【解决方案1】:

您需要重写get_object 方法,让它指向您要更新的对象。

FormView 将构造一个表单 *无需查找对象,您可以使用 UpdateView [Django-doc] 获取带有 get_object 的对象,然后将其注入表单以更新该对象:

from django.views.generic import UpdateView

class UserUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
    form_class = UserUpdateForm
    template_name = 'users/modals/user_update_modal.html'
    success_message = "User updated successfully."

    def get_form_kwargs(self):
        kw = super().get_form_kwargs()
        kw['request'] = self.request
        return kw

    def get_object(self, *args, **kwargs):
        return self.request.user

    def form_invalid(self, form):
        messages.error(self.request, form.errors)
        return super().form_invalid(form)

    def get_success_url(self):
        return reverse('user-detail', kwargs={'pk': self.object.pk })

【讨论】:

  • 它仍然想添加一个新用户并抛出Tb user with this Username already exists.。如果它是一个错误,它不会重定向到用户详细信息。它重定向到没有 CSS 页面的表单。
  • 有没有像 error_url 这样的 success_url 的反函数?
  • @Brat:您确实删除了form_valid 方法并使用了UpdateView,对吧?
  • @Brat:通常如果出现错误,UpdateView重新呈现已填写表单的模板,从而在表单中显示错误。
  • UpdateView不应该基于模型而不是表单吗?
猜你喜欢
  • 2021-12-01
  • 2016-09-24
  • 2012-03-06
  • 2019-07-30
  • 1970-01-01
  • 2015-08-10
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多