J'ai deux modèles liés par une clé étrangère:entrée-forme libre pour ForeignKey le terrain sur un Django ModelForm
# models.py
class TestSource(models.Model):
name = models.CharField(max_length=100)
class TestModel(models.Model):
name = models.CharField(max_length=100)
attribution = models.ForeignKey(TestSource, null=True)
Par défaut, un ModelForm django présentera cela comme un <select>
avec <option>
s; Cependant, je préférerais que cette fonction en tant qu'entrée de forme libre, <input type="text"/>
, et en coulisse obtienne ou crée l'objet TestSource nécessaire, puis le relie à l'objet TestModel.
J'ai essayé de définir un ModelForm personnalisé et sur le terrain pour y parvenir:
# forms.py
class TestField(forms.TextInput):
def to_python(self, value):
return TestSource.objects.get_or_create(name=value)
class TestForm(ModelForm):
class Meta:
model=TestModel
widgets = {
'attribution' : TestField(attrs={'maxlength':'100'}),
}
Malheureusement, je reçois: invalid literal for int() with base 10: 'test3'
en essayant de vérifier is_valid
sur le formulaire soumis. Où vais-je mal? Est-ce leur moyen et plus facile d'accomplir cela?
Cela aide beaucoup. Mais j'ai encore quelques problèmes, un code non standard serait-il nécessaire dans la vue? La mienne explose sur is_valid() check still: Impossible d'assigner "u'myString '": "TestModel.attribution" doit être une instance de "TestSource". – brown145
@ brown145: Je pense que vous devez exclure l'attribution sinon il va essayer de le valider. Voir ma réponse mise à jour. – sdolan