フォームを保存する前に、ユーザーが存在するかどうかを確認する必要があります。フィールドは、名前、姓、および1つまたは複数の値を持つことができるロールです。どうやってやるの?
def save(self, commit=True):
profile = super(ProfileForm, self).save(commit=False)
first_name = self.cleaned_data['first_name']
surname = self.cleaned_data['surname']
role = self.cleaned_data['role']
if Profile.objects.filter(first_name=self.cleaned_data['first_name'], surname=self.cleaned_data['surname']).exists()
raise forms.ValidationError("This profile already exists")
elif commit:
profile.save()
Profile.objects.filter(first_name=self.cleaned_data['first_name'], surname=self.cleaned_data['surname'], role__in[role]).exists()
私に与えますinvalid syntax
エラーを。もちろん、名前と姓と役割がすべて同じプロファイル内に存在するかどうかを確認したいと思います。
私のモデル
class Role(models.Model):
type= models.CharField(max_length=30)
def __str__(self):
return self.type
class Profile(models.Model):
first_name = models.CharField(max_length=120, null=True, blank=True)
surname = models.CharField(max_length=120, null=True, blank=True)
role = models.ManyToManyField(Role, blank=True)
Pleasdeはこれをフォームでチェックしません。モデルでチェックできます。確かに、これはUniqueConstraint
[Django-doc]で実装できます:
class Profile(models.Model):
first_name = models.CharField(max_length=128)
surname = models.CharField(max_length=128)
role = models.CharField(max_length=128)
class Meta:
constraints = [
models.UniqueConstraint(
field=['first_name', 'last_name', 'role'],
name='unique_name_and_role'
)
]
検証はで自動的に行われるためModelForm
、心配する必要はありません。これはデータベースレベルでも実施されます(データベースでサポートされている場合)。
django-2.2より前では、unique_together
[Djanog-doc]を指定できます:
class Profile(models.Model):
first_name = models.CharField(max_length=128)
surname = models.CharField(max_length=128)
role = models.CharField(max_length=128)
class Meta:
unique_together = [['first_name', 'last_name', 'role']]
の場合は、モデルのメソッドでManyToManyField
これを強制する方が適切です。.clean(..)
Profile
class ProfileForm(forms.ModelForm):
# …
def clean(self):
cleaned_data = super().clean()
first_name = self.cleaned_data['first_name']
surname = self.cleaned_data['surname']
role = self.cleaned_data['role']
if Profile.objects.exclude(pk=self.instance.pk).filter(
first_name=first_name,
surname=surname,
role__in=role
).exists():
raise ValidationError('A profile already exists.')
return cleaned_data
ビューでは、たとえば次の方法でこれを処理できます。
def my_view(request):
if request.method == 'POST':
form = ProfileForm(request.POST, request.FILES)
if form.is_valid():
# …
else:
return HttpResponseBadRequest('invalid data')
# …
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加