Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在ModelForm中使用Django ForeignKey字段的不同唯一标识符_Python_Django_Django Models_Django Forms - Fatal编程技术网

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