我有一个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
既不是表单的参数又是表单上的字段是没有意义的。您可能应该将其从字段列表中删除。)