首页 > 解决方案 > 在基于模型 DJANGO 的 ForeignKey 字段的字段上引发错误

问题描述

谢谢你的时间:

我有一个模型可以通过 OneToOneField 获取更多用户信息,并且用户名在保存时变为 Pets.pessoa 字段

如果外键字段(Pets.pessoa)以 'a' 和 Pets.tipo == 2 开头,我想提出一个错误

即使出现错误,我也会创建对象

模型.py:

class People(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='person')
    birthday = models.DateField()
    cpf = models.CharField(max_length=11, validators=[RegexValidator(r'^\d{1,10}$')])

    def __str__(self):
        return '%s' % (self.user)


class Pets(models.Model):
    pessoa = models.ForeignKey(People, on_delete=models.CASCADE)
    nome = models.CharField(max_length=150)
    custo = models.DecimalField(max_digits=7, decimal_places=2)
    tipo = models.SmallIntegerField()

    def __str__(self):
        return '%s - %s' % (self.pessoa, self.nome)

表格.py:

class PetForm3(forms.ModelForm): #SELECIONAR FORM PELO FORMS.PY
    field_choices = [
        (1, 'CACHORRO'),
        (2, 'GATO'),
        (3, 'OUTRO')
    ]

    nome = forms.CharField(max_length=100)
    custo = forms.DecimalField(max_digits=7, decimal_places=2)
    tipo = forms.ChoiceField(choices=field_choices)

    def clean(self, *args, **kwargs):
        pessoa_data = self.cleaned_data.get('pessoa')
        pessoa_string = slugify(pessoa_data)
        tipo_data = self.cleaned_data.get('tipo')
        if pessoa_string.startswith('a') and tipo_data==2:
            raise ValidationError('User começando com A não pode ter gato')
        return super(PetForm3, self).clean(*args, **kwargs)

视图.py:

def create_pet_form(request):
    if request.method == 'POST':
        form = PetForm3(request.POST)
        pet = form.save(commit=False)
        pet.pessoa = request.user.person
        if form.is_valid():
            form.save()
    else:
        form = PetForm3()
    context = {
        'form': form
        }
    return render(request, 'petform3.html', context)

标签: pythondjangopython-3.xdjango-modelsdjango-forms

解决方案


def create_pet_form(request):
    if request.method == 'POST':
        form = PetForm3(request.POST)
        if form.is_valid():
            pet = form.save(commit=False)
            pet.pessoa = request.user.person
            form.save()
    else:
        form = PetForm3()
    context = {
        'form': form
        }
    return render(request, 'petform3.html', context)

如果这项工作


推荐阅读