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

型号

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”,我必须修改什么。

谢谢

最佳答案

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

(同样,fk_function既不是表单的参数又是表单上的字段是没有意义的。您可能应该将其从字段列表中删除。)

10-05 23:07