django modelForm无法验证添加的外键

时间:2019-06-19 13:50:58

标签: python django

我有一个modelForm,其中我重写了 init 方法以从FK提供预定义的值。但是,当使用方法is_valid()验证表单时,它会失败,因为它说“ Palabras”已经存在,但由于两者都是PK,因此并未考虑FK“ fk_funcion”。

Models.py

class Palabras(models.Model):
    fk_funcion = models.ForeignKey(Funcion, related_name='funcion', on_delete=models.CASCADE)
    palabra = models.CharField(max_length=30, unique=True)
    porcentaje = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(100)])

    class Meta:
        unique_together = ("fk_funcion", "palabra"),

    def __str__(self):
        return self.palabra

Forms.py

class PalabraForm(forms.ModelForm):
    class Meta:
        model = Palabras
        fields = ('palabra','porcentaje', "fk_funcion")

    def __init__(self, *args, **kwargs):
        fk_funcion = kwargs.pop('fk_funcion','')
        super(PalabraForm, self).__init__(*args, **kwargs)
        self.fields['fk_funcion']=forms.ModelChoiceField(queryset=Funcion.objects.filter(id=fk_funcion))

Views.py

def create_palabra(request, pk_funcion):
    data = dict()
    if request.method == 'POST':
        form = PalabraForm(request.POST,fk_funcion=pk_funcion,,initial={'fk_funcion':pk_funcion}) #I have tried with and without the initial value
        if form.is_valid():
            #Some action

为了使表单能够验证modelForm中的“ palabra”和“ fk_funcion”,我必须进行哪些修改。

谢谢

1 个答案:

答案 0 :(得分:0)

您已将palabra标记为unique=True。如果只希望它与fk_function一起是唯一的,则将其删除并依靠unique_together约束。

(另外,fk_function既不是表单的参数,也不是表单的字段。您应该将其从字段列表中删除。)