首页 > 解决方案 > 使用 form.py 中模型字段的 Clean_field() 方法更新 Django Modelform 实例

问题描述

我想从 Django 中更新 Book 实例的一些值。我已将 clean_field() 方法放在 forms.py 中。因此,每次我更新表单中的值时,它都会验证 clean_field 并为这两个字段引发验证错误。我想在更新对象的某些参数(如 bookPrice 或 publicationDate)时绕过它。因此,我可以更新该值而不会在现有字段上出现错误。我已将 clean_field() 作为书名 bookisbn。

视图.py

def updateBook(request, key_id):
    book = Book.objects.get(bookIsbn__exact=key_id)

    # date format 2/21/2020
    print(request.method)
    if request.method == 'POST':
        form = BookUploadForm(request.POST, request.FILES, instance=book)
        if form.is_valid():
            form.save()
            return redirect('bookList')
        else:
            print(form.errors.as_data())
    form = BookUploadForm(request.POST or None, request.FILES or None, instance=book)
    template = 'storeApp-Templates/bookUpdate.html'
    context = {'book': book, 'form': form}
    return render(request, template, context)

表格.py

class BookUploadForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = "__all__"
        widgets = {
            'bookName': forms.TextInput(attrs={'class': 'form-controls'}),
            'bookPrice': forms.TextInput(attrs={'class': 'form-controls'}),
            'bookAuthor': forms.TextInput(attrs={'class': 'form-controls'}),
            'bookIsbn': forms.TextInput(attrs={'class': 'form-controls'}),
            'bookPublicationDate': forms.DateInput(attrs={'class': 'form-controls'}),

        }

    bookPublicationDate = forms.DateField(widget=AdminDateWidget())

    # this methods will generate error for book update as well as new book Upload
    def clean_bookName(self, *args, **kwargs):
        bookname = self.cleaned_data.get('bookName')
        qs = Book.objects.filter(bookName__exact=bookname)
        if qs.exists():
            raise forms.ValidationError("This BookName has already been used.")
        return bookname

    def clean_bookIsbn(self, *args, **kwargs):
        bookisbn = self.cleaned_data.get('bookIsbn')
        qs = Book.objects.filter(bookIsbn__exact=bookisbn)
        if qs.exists():
            raise forms.ValidationError("This ISBN has already been used. Please Use a new ISBN.")
        if len(bookisbn) != 11 and len(bookisbn) != 13:
            raise forms.ValidationError("ISBN length has to be 11 or 13.")
        return bookisbn

因此,由于这个 clean_field(),我无法更新图书实例中的任何值,我尝试更新的任何对象都会引发This BookName has been used && This ISBN has been used 的验证错误。请使用新的 ISBN。由于 form.py 中的 clean_field() 验证。

标签: pythondjango

解决方案


推荐阅读