私のフォームでは、ディスクリプタ名がこのプロジェクトで一意であるかどうかを確認します。
Models.py
class Descriptor (models.Model):
project = models.ForeignKey('Project', on_delete=models.CASCADE, default='1')
name = models.CharField(max_length=1000)
forms.py
class DescriptorForm(forms.ModelForm):
class Meta:
model = Descriptor
fields = ('name','project')
widgets = {'project': forms.HiddenInput()}
def clean_name(self):
name = self.cleaned_data['name']
project = self.fields['project']
if Descriptor.objects.filter(project=project, name__iexact=name).exists():
raise ValidationError("Descriptor with this name already exists")
return name
私は得ています
TypeError: int() argument must be a string, a bytes-like object or a number, not
'ModelChoiceField'
project = self.fields['project']
なしおよび
project=project
thecチェックは機能しますが、このプロジェクトに接続されている記述子だけでなく、すべての記述子に対しても機能します。この機能を使用するには、何を変更する必要がありますか?
回答 2 件
モデルを変更できる場合は、
unique_together
を使用できますMeta
一意性チェックを実現する属性。class Descriptor (models.Model): project = models.ForeignKey('Project', on_delete=models.CASCADE, default='1') name = models.CharField(max_length=1000) class Meta: unique_together = ( ('project', 'name'), )
これにより、フォームは次のように縮小されます。
class DescriptorForm(forms.ModelForm): class Meta: model = Descriptor fields = ('project', 'name') widgets = { 'project': forms.HiddenInput(), }
(重要な)側ではない:する必要がありますない
default='1'
を使用する あなたのForeignKey
で 、Project
を予期するため 文字列ではなくインスタンス。
関連記事
- Djangoモデルは一意の制約を追加する方法
- 一意のフィールドエラーが発生したときにDjangoのデータを更新する方法
- Djangobulk_createは複数のフィールドの重複エントリをチェックします
- djangoのカスタム形式の一意のIDジェネレーター
- どのように制約を追加しますか? Djangoのmodelspyで、モデルが取得する変数を確認しますか?
- Djangoは、モデルに一意の値を持つ2つのフィールドを設定しました
- 要素がモデルにあるかどうかを確認します。Djangoテンプレート
- Django Restフレームワーク:一意のフィールドですが、同じ値を持つ複数のオブジェクトを許可します
- Django Template CharField値チェック
fields
の代わりに あなたはcleaned_data
を使用する必要がありますproject
を取得するclean_name
内の値 メソッド、名前の検証中にプロジェクトを利用できるようにフィールドの順序も変更します。self.fields['project']
値ではなく、フィールドクラス自体を返します。