Django ModelForm d'avoir une entrée cachée
Donc, j'ai mon TagStatus modèle. Je suis en train de faire un ModelForm pour elle. Cependant, mon formulaire, le caché d'entrée être renseigné avec le {{ tag.name }}. J'ai été en regardant à travers les docs et je ne sais pas comment faire de la balise de champ caché d'entrée. Peut-être un ModelForm n'est pas la voie à suivre?
models.py:
class TagStatus(models.Model):
user = models.ForeignKey(User, null=True, unique=True)
status = models.CharField(max_length=2, choices=tag_statuses)
tag = models.ForeignKey(Tag, null=True, blank=True)
def __unicode__(self):
return self.status
def save(self, *args, **kwargs):
super(TagStatus, self).save(*args, **kwargs)
class TagStatusForm(modelForm):
class Meta:
model = TagStatus
fields = ('status','tag')
widgets = {
'select': Select,
'tag': ???
}
django views.py:
@login_required
def tags(request):
all_tags = Tag.objects.all()
context = base_context(request)
if request.method == 'POST':
if 'status_check' in request.POST:
status_form = TagStatusForm(request.POST)
#if request.is_ajax():
if status_form.is_valid():
status_form.save()
response = simplejson.dumps({"status": "Successfully changed status"})
else:
response = simplejson.dumps({"status": "Error"})
return HttpResponse (response, mimetype='application/json')
status_form = TagStatusForm()
context['status_form'] = status_form
context['all_tags'] = all_tags
return render_to_response('tags/tags.html', context, context_instance=RequestContext(request))
modèle:
{% for tag in all_tags %}
....
<form class="nice" id="status-form" method="POST" action="">
{% csrf_token %}
<input type="hidden" name="status_check" />
<input type='hidden' name="tag" value="{{ tag.name }}" />
{{ status_form.status }}
</form>
...
{% endfor %}
Comment puis-je faire un caché d'entrée par l'intermédiaire d'un django ModelForm et ensuite de le remplir par le modèle?
Vous devez vous connecter pour publier un commentaire.
Pour faire un champ dans un ModelField un champ caché, utiliser un HiddenInput widget. Le ModelForm utilise un bon widget par défaut pour tous les champs, vous avez juste besoin de le remplacer lorsque l'objet est construit.
Il y a 3 façons possibles (autant que je sache) pour rendre les champs cachés dans Django -
1. Vous pouvez déclarer un champ normalement dans
forms.py
mais dans vos templates html fichier utiliser{{ form.field.as_hidden }}
2. dans
forms.py
utiliser directement caché widget de saisie.Une fois que vous faites le champ caché d'entrée, vous pouvez remplir la valeur du champ dans les modèles. Maintenant, votre champ caché est prêt pour le rendu.
3. Forme régulière équivalent (merci à @Modelesq pour le partage de cette pépite). Ici pas de Django est impliqué. Des changements sont effectués au format HTML au niveau du gabarit.
<input type="hidden" name="tag" value="{{ tag.name }}" />
<input type="hidden" name="tag" value="{{ tag.name }}" />
{{ tag.name }}
ne semble pas fonctionner. J'ai moi-même besoin{{ forloop.counter }}
...Je cherchais un moyen de MASQUER TOUTES les ENTRÉES :
J'ai posté un moyen de le faire avec classe générique des vues basées sur les ici: