2012-07-06 2 views
0

Je suis familier avec l'utilisation de modèles pour collecter les données, mais lors de l'affichage, il y a une manière intelligente que Django affiche les champs et les remplit avec les bonnes valeurs. Je peux le faire manuellement bien sûr, mais le modèle connaît le type de champ. Je n'ai vu aucune documentation à ce sujet. Par exemple, je collectionne des données à partir du modèle avec:Remplissage de modèles Django à partir des enregistrements récupérés

<strong>Company Name</strong> 
    <font color="red">{{ form.companyname.errors }}</font> 
    {{ form.companyname }} 

où la forme est mon modèle d'entreprise contenant tous les champs. Comment pourrais-je m'assurer de pouvoir utiliser ce type de méthodologie de sorte que Django rende les champs de texte et les remplisse avec les valeurs actuelles. Par exemple est-il un moyen d'envoyer des valeurs de la manière suivante:

myid = int(self.request.get('id')) 
    myrecord = Company.get_by_id(myid) 
    category_list = CompanyCategory.all() 
    path = os.path.join(os.path.dirname(__file__), 'editcompany.html') 
    self.response.out.write(template.render(path, {'form': myrecord, 'category_list': category_list})) 

Puis-je faire la même chose avec ce dossier et sera le modèle remplir avec des valeurs envoyées? Merci

+0

Pourquoi ne pas utiliser form.as_p –

+0

ou quelque chose comme {% pour le champ sous forme%} {{ champ}} {% endfor%} –

+0

@JureC. J'ai essayé ceci, mais la forme ne semble pas du tout rendre. – Androidian

Répondre

3

On dirait que vous pouvez être confus au sujet de la différence et l'utilisation appropriée de Form vs ModelForm

Quelle que soit le type de formulaire que vous utilisez, le côté templating des formes reste le même: Note: toutes les valeurs dans votre formulaire (tant qu'il est lié à POST ou a une instance) sera pré-rempli au rendu.

<form class="well" action="{% url member-profile %}" method="POST" enctype="multipart/form-data">{% csrf_token %} 
    <fieldset> 
     {{ form.non_field_errors }} 

     {{ form.display_name.label_tag }} 
     <span class="help-block">{{ form.display_name.help_text }}</span> 
     {{ form.display_name }} 
     <span class="error">{{ form.display_name.errors }}</span> 

     {{ form.biography.label_tag }} 
     <span class="help-block">{{ form.biography.help_text }}</span> 
     {{ form.biography }} 
     <span class="error">{{ form.biography.errors }}</span> 

     <input type="submit" class="button primary" value="Save" /> 
    </fieldset> 
</form> 

si vous voulez être alimenter une forme d'un enregistrement (ou soumettez un formulaire comme un enregistrement) est probablement préférable d'utiliser ModelForm

EX un formulaire de profil qui ne présente pas la liste déroulante FK utilisateur :

class ProfileForm(forms.ModelForm): 
    """Profile form"""  
    class Meta: 
     model = Profile 
     exclude = ('user',) 

la vue:

def profile(request): 
    """Manage Account""" 
    if request.user.is_anonymous() : 
     # user isn't logged in 
     messages.info(request, _(u'You are not logged in!')) 
     return redirect('member-login') 

    # get the currently logged in user's profile 
    profile = request.user.profile 

    # check to see if this request is a post 
    if request.method == "POST": 
     # Bind the post to the form w/ profile as initial 
     form = ProfileForm(request.POST, instance=profile) 
     if form.is_valid() : 
      # if the form is valid 
      form.save() 
      messages.success(request, _(u'Success! You have updated your profile.')) 
     else : 
      # if the form is invalid 
      messages.error(request, _(u'Error! Correct all errors in the form below and resubmit.')) 
    else: 
     # set the initial form values to the current user's profile's values 
     form = ProfileForm(instance=profile) 

    return render(
     request, 
     'membership/manage/profile.html', 
     { 
      'form': form, 
     } 
    ) 

avis que leextérieurinitialise la forme avec une instance: form = ProfileForm(instance=profile) et que le formulaire soumettre le formulaire avec initialise après, MAIS se lie encore par exemple form = ProfileForm(request.POST, instance=profile)

+0

Merci, je l'ai maintenant. Simple vraiment ... parfois je fais une longue documentation sur Django qui résonne avec moi. – Androidian

Questions connexes