it-swarm.com.de

Django ModelForm, um eine versteckte Eingabe zu haben

Ich habe also mein TagStatus-Modell. Ich versuche, eine ModelForm dafür zu erstellen. Für mein Formular muss jedoch die ausgeblendete Eingabe mit {{tag.name}} gefüllt werden. Ich habe die Dokumente durchgesehen und weiß nicht, wie das Tag-Feld zu einer versteckten Eingabe wird. Vielleicht ist ein ModelForm nicht der richtige Weg?

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

vorlage:

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

Wie gehe ich vor, um eine versteckte Eingabe durch eine Django ModelForm vorzunehmen und sie dann durch die Vorlage zu füllen?

59
Modelesq

Um ein Feld in einem ModelField zu einem ausgeblendeten Feld zu machen, verwenden Sie ein HiddenInput-Widget. Die ModelForm verwendet ein sinnvolles Standard-Widget für alle Felder. Sie müssen es nur überschreiben, wenn das Objekt erstellt wird.

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

Es gibt 3 Möglichkeiten (AFAIK), um ausgeblendete Felder in Django zu rendern -

1. Sie können ein Feld normalerweise in forms.py angeben, aber in Ihrer Templates-HTML-Datei verwenden Sie {{ form.field.as_hidden }}.

2. in forms.py verwende direkt verstecktes Eingabe-Widget.

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

Wenn Sie das Feld zu einer verborgenen Eingabe machen, können Sie den Wert des Felds in Vorlagen auffüllen. Jetzt ist Ihr verstecktes Feld für das Rendern bereit. 

3. Entsprechendes reguläres Formular (Dank an @Modelesq für das Teilen dieses Nuggets). Hier ist kein Django beteiligt. Änderungen werden auf HTML-Vorlagenebene vorgenommen. <input type="hidden" name="tag" value="{{ tag.name }}" />

71

Ich habe nach einem Weg gesucht, ALLE EINGÄNGE zu verbergen: 

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()
0
Lucas B

Ich habe einen Weg gepostet mit generischen klassenbasierten Ansichten hier :

from Django.forms import HiddenInput

from Django.forms.models import modelform_factory

_patient_create_form = modelform_factory(
    models.Patient,
    fields=['name', 'caregiver_name', 'sex', 'birth_date',
            'residence', 'country'],
    widgets={'country': HiddenInput()})

class PatientCreate(LoginRequiredMixin, UserOrgRequiredMixin, CreateView):
    form_class = _patient_create_form
    template_name = 'healthdbapp/patient_form.html'
0
dfrankow