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">
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
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. –