tipos personalizados formularios fields ejemplos crear avanzados python django django-models django-forms

python - personalizados - Django ModelForm para tener una entrada oculta



post django (3)

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

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?


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 }}" />


Para convertir un campo en un campo oculto de ModelField en un campo oculto, use un widget HiddenInput. El ModelForm utiliza un widget sensible por defecto para todos los campos, solo tiene que anularlo cuando se construya el objeto.

class TagStatusForm(forms.ModelForm): class Meta: model = TagStatus widgets = {''tag'': forms.HiddenInput()}