2010-07-08 19 views
0

J'ai une page qui affiche un formulaire qu'un utilisateur connecté peut utiliser pour modifier son profil.Django: Comment accéder aux données de champ modelform dans les modèles

La première fois que l'utilisateur charge la vue correspondante, avec une requête GET, le formulaire doit afficher les valeurs de l'enregistrement de profil existant de l'utilisateur. Étant donné que je souhaite avoir un contrôle granulaire sur le balisage utilisé pour les champs de formulaire, je souhaite récupérer uniquement les valeurs de champ et écrire manuellement le balisage d'élément d'entrée nécessaire en insérant les valeurs de champ récupérées en tant qu'éléments d'entrée. Attribut '' value '' (plutôt que django rendre les éléments d'entrée entiers). Jusqu'à présent, j'ai essayé d'utiliser des directives comme {{form.myfield.data}} dans mon modèle pour accéder aux données du champ, mais cela retourne "None", au lieu des détails du profil comme je l'avais prévu.

Si l'utilisateur vient de publier un formulaire valide, les champs de formulaire contiennent les détails de profil attendus.

J'espère que quelqu'un peut me aider à comprendre ce que je fais mal ici:

Voilà mon avis:

@login_required 
def edit(request): 
    # get logged-in user's profile 
    obj=Profile.objects.get(user=request.user) 
    if request.method == 'POST': # If the form has been submitted... 
     form = ProfileForm(request.POST, request.FILES, instance=obj) 
     if form.is_valid(): # All validation rules pass 
      form.save() 
      request.flash['success'] = "Your profile has been updated." # Puts a string to the flash scope 
     else: 
      request.flash['error'] = 'Please correct the problems below and try again' # Puts a string to the flash scope 
    else: 
     # if no form was submitted 
     # derive the form data from the logged-in users existing profile 
     form = ProfileForm(instance=obj)  
    return render_to_response('app_profile/edit.html', 
    { 
    'form': form, 
    'user': request.user, 
    'ancestor_urls': ['app_profile.views.edit',], 
    },context_instance=RequestContext(request) 
) 

Et voici un extrait du modèle correspondant. Cet élément d'entrée gère un champ appelé "nom_affichage".

<input type="text" 
class="textInput large {% if form.display_name.errors %}error{% endif %}" 
maxlength="50" 
size="35" 
value="{{ form.display_name.data }}" 
id="id_display_name" 
name="display_name"> 

Répondre

1

La façon de faire ce que vous voulez faire est d'écrire des widgets de formulaire personnalisé, au lieu de le faire dans le modèle.

Vous pouvez créer un tout widget de commande, ou vous pouvez simplement ajouter/modifier les attributs au niveau de formulaire lorsque vous initialisation le ModelForm

+0

Merci. J'ai l'impression que l'écriture d'un widget personnalisé est la meilleure option pour la facilité de maintenance. Ce qui me pose problème pour le moment, c'est de comprendre comment accéder à l'objet d'erreurs d'un champ depuis le code du widget personnalisé. – bitbutter

+0

Les erreurs seraient définies par la fonction de validation du champ de formulaire. le widget est le balisage et css, le champ de formulaire est la logique. Vous pouvez écrire les deux. –

Questions connexes