Python 如何在ModelForm中使用Django ForeignKey字段的不同唯一标识符
我有以下Python 如何在ModelForm中使用Django ForeignKey字段的不同唯一标识符,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我有以下型号s: 教材(models.Model): name=models.CharField(最大长度=128) isbn=models.CharField(最大长度=13,唯一性=True) available=models.BooleanField(默认值=True) 类借用(models.Model): 日期=型号。日期时间字段(自动\u现在\u添加=真) 书本=模型。外键(书本) 以及以下ModelForm: class CreateBrowForm(forms.ModelForm
型号
s:
教材(models.Model):
name=models.CharField(最大长度=128)
isbn=models.CharField(最大长度=13,唯一性=True)
available=models.BooleanField(默认值=True)
类借用(models.Model):
日期=型号。日期时间字段(自动\u现在\u添加=真)
书本=模型。外键(书本)
以及以下ModelForm
:
class CreateBrowForm(forms.ModelForm):
类元:
模型=借用
字段=['book']
def清洁手册(自我):
book=self.cleaned_数据['book']
尝试:
return Book.objects.get(id=Book,available=True)
除Book.DoesNotExist外:
raise ValidationError('账簿不存在或不可用')
我想要一个表单,它需要Book
模型的isbn
字段,而不是id
。由于isbn
字段是唯一的,因此它确实有意义。在clean_book
方法中,我需要做一些更改,以获得以下行:
返回Book.objects.get(isbn=Book,available=True)
问题是我找不到一种方法来强制表单使用不同的唯一标识符。在我的特定情况下,这是避免对数字ID进行暴力枚举所必需的。您需要为此使用自定义字段,并重写
save()
方法,而不是clean\u field()
:
您需要为此使用自定义字段,并重写
save()
方法,而不是clean\u字段()
:
class CreateBorrowForm(forms.ModelForm):
book_isbn = forms.CharField()
class Meta:
model = Borrow
fields = ['book_isbn']
def save(self, commit=True):
instance = super().save(commit=False)
book_isbn = self.cleaned_data['book_isbn']
try:
book = Book.objects.get(isbn=book_isbn, available=True)
instance.book = book
except Book.DoesNotExist:
raise ValidationError('Book does not exist or it is unavailable')
if commit:
instance.save()
return instance