【问题标题】:Edited form not getting saved in django编辑后的表格没有保存在 django 中
【发布时间】:2021-07-20 07:01:36
【问题描述】:

我已经修复了几乎所有内容,表单打开,我可以进行编辑,但一旦我进行编辑并点击保存,就会显示:

我不明白出了什么问题。我为我的编辑个人资料页面做了同样的事情,它在那里工作得很好,所以我不明白为什么它在这里不起作用。

views.py:

class EditComplaint(UserPassesTestMixin, UpdateView):
   model = Complaint
   fields = ('reportnumber', 'eventdate', 'event_type', 'device_problem', 'manufacturer', 
  'product_code', 'brand_name', 'exemption', 'patient_problem', 'event_text', 'document')  
   template_name = 'newcomplaint.html'
   def form_valid(self, request):
       complaint = request.user.complaint
       form = ComplaintForm(instance=complaint)
       if request.method == 'POST':
          form = ComplaintForm(request.POST, request.FILES, instance=complaint)
          if form.is_valid():
             form.save()
       context = {'form': form}
       return render(request, 'newcomplaint.html', context)

   def test_func(self):
       complain = self.get_object()

       if self.request.user == complain.user:
           return True
       raise Http404(_('This complain does not exist'))

urls.py:

path('Complaint/<int:pk>/edit/', accounts.views.EditComplaint.as_view(), 
name='Complaint')

似乎有什么问题?我认为我需要改变我的观点,因为其他一切似乎都运作良好,所以我不包括其他任何东西。但我不明白需要改变什么

forms.py:

class DateInput(forms.DateInput):
input_type = 'date'

class ComplaintForm(ModelForm):
   class Meta:
       model = Complaint
       fields = '__all__'
       widgets = {
           'reportnumber': forms.TextInput(attrs={'placeholder': 'Report 
            number'}),
           'event_type': forms.TextInput(attrs={'placeholder': 'Event 
            type'}),
           'eventdate': DateInput(),
           'device_problem': forms.TextInput(attrs={'placeholder': 
           'Device Problem'}),
           'event_text': forms.Textarea(attrs={'style': 'height: 
            130px;width:760px'}),
            'manufacturer': forms.TextInput(attrs={'placeholder': 'Enter 
            Manufacturer Name'}),
           'product_code': forms.TextInput(attrs={'placeholder': 'Enter 
            Product Code'}),
           'brand_name': forms.TextInput(attrs={'placeholder': 'Enter 
            Brand Name'}),
           'exemption': forms.TextInput(attrs={'placeholder': 'Enter 
            Exemption'}),
           'patient_problem': forms.TextInput(attrs={'placeholder': 
           'Enter Patient Problem'}),
       }
    
   def clean(self):
       cleaned_data = super(ComplaintForm, self).clean()
       reportnumber = cleaned_data.get('reportnumber')
       event_text = cleaned_data.get('event_text')
       if not reportnumber and not event_text:
           raise forms.ValidationError('You have to write something!')
       return cleaned_data

models.py:

class Complaint(models.Model):
   user = models.ForeignKey(User, on_delete= models.CASCADE, null = 
   True, blank=True)
   id = models.AutoField(blank=False, primary_key=True)
   reportnumber = models.CharField(max_length=500 ,null = True, blank= 
   False)
   eventdate = models.DateField(null=True, blank=False)
   event_type = models.CharField(max_length=300, null=True, blank=True)
   device_problem = models.CharField(max_length=300, null=True, 
   blank=True)
   manufacturer = models.CharField(max_length=300, null=True, 
   blank=True)
   product_code = models.CharField(max_length=300, null=True, 
   blank=True)
   brand_name = models.CharField(max_length = 300, null=True, 
   blank=True)
   exemption = models.CharField(max_length=300, null=True, blank=True)
   patient_problem = models.CharField(max_length=500, null=True, 
   blank=True)
   event_text = models.TextField(null=True, blank= True)
   document = models.FileField(upload_to='static/documents', blank=True, 
   null=True)

   def __str__(self):
       return self.reportnumber

【问题讨论】:

    标签: django django-models django-views django-forms django-templates


    【解决方案1】:

    form_valid 的第二个参数是已验证的form,而不是请求。您可以使用self.request 访问请求。

    但是您不需要自己处理这个问题:UpdateView 逻辑已经具备创建和验证 POST 请求的逻辑。只有当表单有效时它才会运行form_valid,并且默认保存表单并重定向到成功的url:

    from django.contrib.auth.mixins import LoginRequiredMixin
    
    class EditComplaint(LoginRequiredMixin, UpdateView):
        model = Complaint
        form_class = ComplaintForm
        success_url = 'url-to-redirect-to'
    
        def get_queryset(self, *args, **kwargs):
            return super().get_queryset(*args, **kwargs).filter(
                user=self.request.user
            )

    我为我的编辑个人资料页面做了同样的事情,而且效果很好。

    基于类的视图通常实现大部分代码流,因此通常只需指定一些项目,如form_classsuccess_url 等。通常,如果您需要编写大块逻辑,这意味着您实现了已经存在的逻辑,或者视图很复杂,因此应该由基于函数的视图或其他基于类的视图来实现。

    当成功url依赖对象时,可以覆盖get_success_url

    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.urls import reverse
    
    class EditComplaint(LoginRequiredMixin, UpdateView):
        model = Complaint
        form_class = ComplaintForm
    
        def get_queryset(self, *args, **kwargs):
            return super().get_queryset(*args, **kwargs).filter(
                user=self.request.user
            )
    
        def get_success_url(self):
            return reverse('Complaint', kwargs={'pk': self.object.pk})

    您可以通过省略表单中的user字段来自动设置用户,并将user设置为:

    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.urls import reverse
    
    class EditComplaint(LoginRequiredMixin, UpdateView):
        model = Complaint
        form_class = ComplaintForm
    
        def get_queryset(self, *args, **kwargs):
            return super().get_queryset(*args, **kwargs).filter(
                user=self.request.user
            )
    
        def get_success_url(self):
            return reverse('Complaint', kwargs={'pk': self.object.pk})
        
        def form_valid(self, form):
            form.instance.user = self.request.user
            return super().form_valid(form)

    注意:您可以将视图限制为基于类的视图,以向经过身份验证的用户提供 LoginRequiredMixin mixin [Django-doc].

    【讨论】:

    • 如果我希望它在编辑后重定向到自己,我应该在成功 url 中添加什么?
    • 如果您有视图的名称,您可以使用reverse_lazyreverse_lazy('name-of-view')
    • success_url = reverse_lazy('Complaint') 这是我放的,但它仍然无法识别,对不起,我是 django 的初学者,不知道 reverse_lazy 和重定向是如何工作的
    • 但它应该是视图的名称,您可以通过编辑您的问题来分享urls.py...
    • 添加了网址格式
    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    相关资源
    最近更新 更多