2009-10-14 6 views
4

J'ai un formset de modèle en ligne, et je voudrais rendre des champs non éditables si ces champs ont déjà des valeurs quand la page est chargée. Si l'utilisateur clique sur un bouton "Modifier" sur cette ligne, il deviendra éditable et (en utilisant JavaScript) je remplacerais les widgets originaux par des éditables. Je voudrais faire quelque chose comme ceci lors du chargement de la page:Django: Comment créer des champs non éditables par défaut dans un formset de modèle en ligne?

for field in form.fields: 
    if field.value: 
     # display as text 
    else: 
     # display as my standard editable widget for this field 

Je vois que inlineformset_factory a un argument appelé formfield_callback. Je pense que cela pourrait être utile, mais je n'ai trouvé aucune documentation à ce sujet. Quelqu'un peut-il me diriger vers une documentation utile à ce sujet, et comment cela peut m'aider à résoudre ce problème?

Répondre

0

Je pense que vous pourriez être en mesure de remplacer la fonction init de votre formulaire qui est utilisé dans un formset. Là, vous pouvez vérifier les données initiales et construire dynamiquement vos formulaires comme vous l'espérez. Au moins, cela semble plausible dans ma tête.

+0

Eh bien, je dois vérifier un objet par exemple, pas initial_data, mais je vois ce que vous dites. Le problème est, que dois-je faire à partir de là? Comment modifier les widgets de champ à l'intérieur de la méthode __init__ de ModelForm? – Jeff

+0

Peu importe. self.fields ['fieldname']. widget ... – Jeff

0

J'avais une question où je voulais « Auto-generate form fields », peut trouver une solution permettant de créer dynamiquement des formes, il peut aider:

Auto-generate form fields for a Form in django

Il est pas propre et il y a probablement une meilleure façon de gérer cette .

Que diriez-vous juste d'envoyer les données comme éditables (formset normal) à partir de django et faire la vérification de la valeur avec javascript, en utilisant javascript pour basculer les widgets?

+0

Oui, l'utilisation de JavaScript est mon fallback. Je préférerais ne pas le faire, si je peux construire les formulaires comme je les veux sur le serveur. Je devrais être capable de faire ça; c'est juste une question de finagling django en me permettant ce genre de personnalisation. – Jeff

12

Celui-ci m'a aussi bloqué un peu. J'espère que c'est ce que vous cherchez.

<TABLE> 
    <form method="post" action="."> 
     {{ formset.management_form }} 
     {% for form in formset.forms %} 
      {{ form.id }} 
      <tr> 
       <td>{{ form.FirstName }}</td> <!-- This is a normal, editable field --> 
       <td>{{ form.instance.LastName }}</td> <!-- 'instance' is your actual Django model. LastName displays the text from the last name field --> 
      </tr> 
     {% endfor %} 
    </form> 
</TABLE> 
+1

Pour moi, appeler 'form.initial.LastName' aurait fait l'affaire. –

+1

@Aaron C. de Bruyn, merci! – bordeltabernacle

6

Ce fil est un peu vieux, mais pour tous ceux qui cherchent:

sous la forme:

myfield=forms.CharField(widget=forms.TextInput(attrs={'class':'disabled', 'readonly':'readonly'})) 

La « lecture seule » est un attribut HTML qui rend la forme non modifiable. "disabled" est une classe CSS car vous voudrez modifier le style par défaut, cela rend également le jQuery plus simple.

Pour faire des entrées en lecture seule modifiable lorsque vous cliquez dessus, voici un exemple jQuery:

$('input.disabled').click(function(){ 
    $(this).removeAttr('readonly').removeClass('disabled'); 
}); 
+0

Cela pourrait poser un problème de sécurité. Utilisez les outils de développement dans le navigateur pour supprimer l'attribut 'désactivé' et tout à coup le champ est modifiable. Vous devez vous assurer que le back-end sait également qu'il doit ignorer les changements sur le terrain. –

Questions connexes