2010-11-12 22 views
1

J'ai un formulaire de profil/compte typique. Donc, comme prévu, vous auriez un champ "nom" et un champ "domaine" (qui sera utilisé comme un site web url: maddy.mywebsite.com). Ce champ de domaine doit être modifiable une seule fois. Une fois réglé à une chose, ne sera pas éditable plus tard (puisque c'est comme une URL de site). Au niveau du modèle, je compare create_on et modified_on de cet objet (userprofile) et je valide la sauvegarde de la valeur "domain". Mais au niveau du formulaire, comment puis-je personnaliser le rendu de ce champ uniquement en fonction de la condition que j'ai prise?Django: Rendu un champ de formulaire en tant que champ de texte modifiable une seule fois et en lecture seule après

Remarque 1: je ne souhaite pas déplacer le champ "domaine" vers la page d'inscription.

Note 2: J'essaie d'utiliser des formes normales (django.forms) et non un ModelForm.

Répondre

1

Vous pouvez essayer d'utiliser deux fichiers html, un pour créer un profil et un pour modifier le profil. Rendez le formulaire complet dans create profile et pour modifier le profil si vous utilisez le même django, vous pouvez désactiver le #id_name et le #id_domain déposés en utilisant css ou javascript. Une mise en œuvre à l'aide js:

<script type="text/javascript"> 
     var domain = document.getElementById("id_domain"); 
     var name = document.getElementById("id_name"); 
     domain.value = "{{ domain }}"; 
     name.value = "{{ name }}"; 
     domain.readOnly = true;   
    </script> 
+0

Je ne pense pas que ce soit une bonne idée de faire confiance au navigateur/utilisateur pour ne pas modifier la valeur. Django sauvegardera toujours le domaine (espérons-le inchangé) dans ce cas et rien n'empêche l'utilisateur de le modifier avec FireBug ou similaire. – Tom

+0

Vous pouvez essayer d'utiliser deux formulaires django différents à la place. Celui pour l'édition du profil avec les champs de nom et de domaine est désactivé et rend le nom et le domaine de la base de données séparément. – crodjer

+0

@dcrodjer: Je veux éviter deux formes car les avoir serait difficile à maintenir. –

1

Cela semble difficile, vous pouvez lire certains des éléments suivants pour quelques idées:

In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited?

http://lazypython.blogspot.com/2008/12/building-read-only-field-in-django.html

Aucun d'entre eux sont particulièrement simple, donc Je suggère (comme @dcrodjer):

Création de deux formulaires, un pour créer, un pour l'édition. Sur le formulaire d'édition, supprimer le champ de domaine il est donc pas nécessaire/ne sera pas sauvé:

# forms.py 

class AddForm(ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('name','domain',) 

class EditForm(ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('name',) 

À votre avis, la création de la forme appropriée, et dans votre modèle, ce qui rend différent HTML en fonction de laquelle vous remplissez » J'ai été donné:

{% if form.domain %} 
    {{form.domain.label_tag}}: {{form.domain}} {{form.domain.errors}} 
{% else %} 
    Domain: <input type="text" disabled="disabled" value="{{userprofile.domain}}"/> 
{% endif %} 
+0

Je veux éviter deux formulaires (et en particulier ModelForms) –

+0

L'utilisation d'un ModelForm n'est pas pertinent dans ce cas. Si vous voulez éviter d'utiliser deux formes, je dis juste faire le {% if%} dans le template alors. Django n'a pas d'attribut readonly que vous pouvez définir après la création d'un formulaire par une vue, il n'y a donc pas de "bonne" méthode. – Tom