python - personalizados - tipos de formularios en django




Django ModelForm para tener una entrada oculta (2)

Así que tengo mi modelo TagStatus. Estoy tratando de hacer un ModelForm para eso. Sin embargo, mi formulario requiere que la entrada oculta se rellene con {{tag.name}}. He estado revisando los documentos y no sé cómo hacer que el campo de etiqueta sea una entrada oculta. Tal vez un ModelForm no es el camino a seguir?

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))

modelo:

{% 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 %}

¿Cómo voy a hacer una entrada oculta a través de un django ModelForm y luego llenarla a través de la plantilla?


Estaba buscando una manera de OCULTAR TODAS LAS ENTRADAS:

class TagStatusForm(forms.ModelForm):
    class Meta:
        model = TagStatus

    def __init__(self, *args, **kwargs):
        super(TagStatusForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].widget = forms.HiddenInput()

Hay 3 formas posibles (AFAIK) para representar campos ocultos en Django:

1. Usted podría declarar un campo normalmente en forms.py pero en su archivo html de plantillas use {{ form.field.as_hidden }}

2. en forms.py usa directamente el widget de entrada oculto.

class MyForm(forms.Form):
    hidden_field = forms.CharField(widget=forms.HiddenInput())

Una vez que hace que el campo sea una entrada oculta, puede poblar el valor del campo en las plantillas. Ahora tu campo oculto está listo para renderizar.

3. Forma regular equivalente (gracias a @Modelesq para compartir esta pepita). Aquí no hay Django involucrado. Los cambios se realizan a nivel de plantilla HTML. <input type="hidden" name="tag" value="{{ tag.name }}" />





django-forms