2012-08-17 2 views
0

J'ai une grande forme à gérer avec django. Mon modèle est comme ci-dessousDjango Formulaire avec données de modèle pré-chargées

class MerchantContact(models.Model): 
    merchant = models.OneToOneField(MerchantProfile, related_name="merchant_contact") 

    ContactUsAddressLine1 =models.CharField(max_length=16) 
    ContactUsAddressLine2 =models.CharField(max_length=16) 
    ContactUsAddressCity =models.CharField(max_length=16) 
    ContactUsAddressState =models.CharField(max_length=4) 
    ContactUsAddressZip=models.CharField(max_length=16) 
    ContactUsPhone=models.CharField(max_length=16) 
    ContactUsAddressFax=models.CharField(max_length=16) 
    ContactUsEmail=models.CharField(max_length=64) 
    ContactUsBusinessHours=models.CharField(max_length=256) 

J'ai utilisé la logique suivante pour remplir la forme

def merchantAccountInfo(request): 
    #check if data is already there or not 
    usr=UserProfile.objects.get(user_id=request.user.id) 
    merchant=MerchantProfile.objects.get(user_id=usr.id) 
    try: 
     mc=MerchantContact.objects.get(merchant_id=merchant.id) 
     formdata=MerchantContactForm(
         {'id':mc.id, 
         'ContactUsAddressLine1':mc.ContactUsAddressLine1, 
         'ContactUsAddressLine2':mc.ContactUsAddressLine2, 
         'ContactUsAddressCity':mc.ContactUsAddressCity, 
         'ContactUsAddressState':mc.ContactUsAddressState, 
         'ContactUsAddressZip':mc.ContactUsAddressZip, 
         'ContactUsPhone':mc.ContactUsPhone, 
         'ContactUsAddressFax':mc.ContactUsAddressFax, 
         'ContactUsEmail':mc.ContactUsEmail, 
         'ContactUsBusinessHours':mc.ContactUsBusinessHours 
         } 
     ) 

    except MerchantContact.DoesNotExist: 
     formdata=MerchantContactForm() 
    return render_to_response('account_info.html',locals(),context_instance=RequestContext(request)) 

Le code fonctionne parfaitement au-dessus, mais je crains que la forme pourrait être trop grand avec plus de 30 champs. Passant chaque champs en ligne sera trop fastidieux ..

D'autres alternatives pour gagner du temps et des lignes de code?

Répondre

3

Vous pouvez utiliser le paramètre instance pour instancier un formulaire qui mettra les données initiales dans le formulaire à partir de cet objet, au lieu de fournir des attributs de dict.

comme:

formdata=MerchantContactForm(instance=mc)

+1

Cela suppose que vous avez créé un 'ModelForm' et non un' Form' standard, mais il devrait être un 'ModelForm' si ce n'est pas le cas. –

0

Oui vous avez besoin de lire la documentation sur ModelForms. Ils construisent un formulaire basé sur les données d'un modèle. Si vous voulez installer un style ou des widgets supplémentaires sur le modèle, vous pouvez faire cela comme ajouter un RTE dans l'admin, je crois. Allez dans les documents officiels de votre version et consultez la documentation de modelforms. C'est le moyen le plus rapide de générer un formulaire à partir d'un modèle. Vous pouvez même définir les attributs CSS entre autres choses.

Questions connexes