2010-08-31 9 views
1

Je me demande s'il existe un moyen simple de créer un ModelForm "dupliqué" dans Django - c'est-à-dire un formulaire qui est pré-rempli avec le contenu d'une instance de modèle existante (excepté certains champs, tels que qui sont uniques), mais crée une nouvelle instance lors de l'enregistrement. Je pensais à fournir une instance à un ModelForm afin que les données soient remplies comme dans un formulaire "edit", puis à définir l'instance sur None avant d'enregistrer, mais cela donne un objet "NoneType". pas d'attribut 'pk' "erreur lors de l'appel de .save() sur le formulaire. Il semble que le fait de fournir une instance lors de la construction du formulaire crée une certaine dépendance à ce qu'il soit là à la fin.Django "Duplicate" ModelForm

J'ai eu de la difficulté à trouver une solution à ce problème, mais je ne peux pas imaginer qu'un formulaire "en double" soit trop unique, alors peut-être qu'il me manque quelque chose de simple?

Toute aide serait appréciée.

Répondre

1

Je pense que ce dont vous avez besoin est un moyen de remplir les valeurs initiales pour les champs dans le formulaire. La meilleure façon d'y parvenir serait de créer un dictionnaire de valeurs initiales (entrées par nom de champ) à partir d'une instance existante et de fournir ceci au formulaire.

Quelque chose comme ceci:

class AddressForm(forms.ModelForm): 
    class Meta: 
     model = Address 

# Inside view: 
address = Address.object.get(**conditions) 
initial = dict() 
for field in ('state', 'zipcode'): # Assuming these are the fields you want to pre-fill 
    initial[field] = getattr(address, field) 

form = AddressForm(initial = initial) 
1
class AddressForm(forms.ModelForm): 
    class Meta: 
     model = Address 

# Inside view: 
address = Address.object.get(pk=<your-id>) 
address.pk = None # that's the trick, after form save new object will be created 
form = AddressForm(instance=address) 
+0

Cela ne semble pas fonctionner comme modifier la propriété pk ne semble pas modifier le champ de clé primaire réelle (« id » dans mon cas). Ainsi, ModelForm écrase toujours l'objet existant plutôt que d'en créer un nouveau. – oogles

Questions connexes