bugfix> django > 投稿

私のフォームでは、ディスクリプタ名がこのプロジェクトで一意であるかどうかを確認します。

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 件
  • fields の代わりに  あなたは cleaned_data を使用する必要があります   project を取得する   clean_name 内の値  メソッド、名前の検証中にプロジェクトを利用できるようにフィールドの順序も変更します。

    class DescriptorForm(forms.ModelForm):
        class Meta:
            model = Descriptor
            fields = ('project', 'name')
            widgets = {'project': forms.HiddenInput()}
        def clean_name(self):
            name = self.cleaned_data['name']
            project = self.cleaned_data['project']
            if Descriptor.objects.filter(project=project, name__iexact=name).exists():
                raise ValidationError("Descriptor with this name already exists")
            return name
    
    

    self.fields['project']  値ではなく、フィールドクラス自体を返します。

  • モデルを変更できる場合は、 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 を予期するため  文字列ではなくインスタンス。

あなたの答え