88 Stimmen

Wie kann ich den Wert eines Django-Formularfeldes in einer Vorlage anzeigen?

Ich habe ein Formular mit einer E-Mail-Eigenschaft.

Bei der Verwendung von {{ form.email }} Im Falle eines Validierungsfehlers rendert Django immer noch den vorherigen Wert im value-Attribut des input-Tags:

<input type="text" id="id_email" maxlength="75" class="required"
       value="some@email.com" name="email">

Ich möchte das Eingabe-Tag selbst rendern (um etwas JavaScript-Code und eine Fehlerklasse für den Fall eines Fehlers hinzuzufügen). Zum Beispiel ist dies meine Vorlage anstelle von {{ form.email }} :

<input type="text" autocomplete="on" id="id_email" name="email"
       class="email {% if form.email.errors %} error {% endif %}">

Allerdings wird der fehlerhafte Wert nicht angezeigt ( some@email.com in diesem Beispiel) an den Benutzer.

Wie erhalte ich den Wert des Feldes in der Vorlage?

6voto

Eran Kampf Punkte 8748

Die von Jens vorgeschlagene Lösung ist richtig. Es stellt sich jedoch heraus, dass, wenn Sie Ihre ModelForm mit einer Instanz (Beispiel unten) wird Django die Daten nicht auffüllen:

def your_view(request):   
    if request.method == 'POST':
        form = UserDetailsForm(request.POST)
        if form.is_valid():
          # some code here   
        else:
          form = UserDetailsForm(instance=request.user)

Also habe ich meine eigene ModelForm-Basisklasse erstellt, die die anfänglichen Daten auffüllt:

from django import forms 
class BaseModelForm(forms.ModelForm):
    """
    Subclass of `forms.ModelForm` that makes sure the initial values
    are present in the form data, so you don't have to send all old values
    for the form to actually validate.
    """
    def merge_from_initial(self):
        filt = lambda v: v not in self.data.keys()
        for field in filter(filt, getattr(self.Meta, 'fields', ())):
            self.data[field] = self.initial.get(field, None)

Die einfache Ansicht sieht dann wie folgt aus:

def your_view(request):   if request.method == 'POST':
    form = UserDetailsForm(request.POST)
    if form.is_valid():
      # some code here   
    else:
      form = UserDetailsForm(instance=request.user)
      form.merge_from_initial()

3voto

kosii Punkte 6585

Ich wollte den Wert eines Formularfelds anzeigen. Ich habe diese Lösung gefunden, die auch für normale Formulare funktionieren sollte:

{% if form.email.data %} {{ form.email.data }}
{% else %} {{ form.initial.email }} 
{% endif %}

Die oben genannten Lösungen haben bei mir nicht sehr gut funktioniert, und ich bezweifle, dass sie bei vorangestellten Formularen (wie Assistenten und Formularsätzen) funktionieren würden. Die Lösungen mit {{ form.data.email }} kann nicht funktionieren, da es sich um eine Wörterbuchsuche handelt und der Feldname bei Formularen mit vorangestelltem Präfix etwa so aussehen würde wie "1-email" (Assistent und Formular mit vorangestelltem Präfix) oder "form-1-email" (Formularsatz), und das Minuszeichen (-) ist in gepunkteten Suchausdrücken für Vorlagen nicht zulässig.

{{form.field_name.value}} ist nur für Django 1.3+.

3voto

Durodola Opemipo Punkte 179

Ich habe einige der genannten Möglichkeiten ausprobiert, und so habe ich mein Problem gelöst:

#forms.py
class EditProfileForm(forms.ModelForm):
    first_name = forms.CharField(label='First Name',
                                 widget=forms.TextInput(
                                 attrs={'class': 'form-control'}),
                                 required=False)
    last_name = forms.CharField(label='Last Name',
                                 widget=forms.TextInput(
                                 attrs={'class': 'form-control'}),
                                 required=False)
    # username = forms.CharField(widget=forms.TextInput(
    #                              attrs={'class': 'form-control'}),
    #                              required=True)
    address = forms.CharField(max_length=255, widget=forms.TextInput(
                                 attrs={'class': 'form-control'}),
                                 required=False)
    phoneNumber = forms.CharField(max_length=11,
                                 widget=forms.TextInput(
                                 attrs={'class': 'form-control'}),
                                 required=False)
    photo = forms.ImageField(label='Change Profile Image', required=False)

    class Meta:
        model = User
        fields = ['photo', 'first_name', 'last_name', 'phoneNumber', 'address']
                  # 'username',

#views.py
def edit_user_profile(request, username):
    user = request.user
    username = User.objects.get(username=username)
    user_extended_photo = UserExtended.objects.get(user=user.id)
    form = EditProfileForm(request.POST or None, request.FILES, instance=user)
    user_extended = UserExtended.objects.get(user=user)
    if request.method == 'POST':
        if form.is_valid():
            # photo = UserExtended(photo=request.FILES['photo'] or None, )
            user.first_name = request.POST['first_name']
            user.last_name = request.POST['last_name']
            user_extended.address = request.POST['address']
            user_extended.phoneNumber = request.POST['phoneNumber']
            user_extended.photo = form.cleaned_data["photo"]
            # username = request.POST['username']
            user_extended.save()
            user.save()

            context = {
                'form': form,
                'username': username,
                'user_extended_photo': user_extended_photo,
            }

            return render(request, 'accounts/profile_updated.html', context)
    else:
        photo = user_extended.photo
        first_name = user.first_name
        last_name = user.last_name
        address = user_extended.address
        phoneNumber = user_extended.phoneNumber
        form = EditProfileForm(
            initial={'first_name': first_name, 'last_name': last_name,
                                   'address': address, 'phoneNumber': phoneNumber,
                                   'photo': photo})
    context = {
        'form': form,
        'username': username,
        'user_extended_photo': user_extended_photo,

    }
    return render_to_response('accounts/edit_profile.html', context,
                                 context_instance=RequestContext(request))

#edit_profile.html
  <form action="/accounts/{{ user.username }}/edit_profile/" method="post" enctype='multipart/form-data'>
                                    {% csrf_token %}
                                        <div class="col-md-6">
                                            <div class="form-group">
                                                {{ form.as_p }}
                                            </div>
                                        </div>
                                    <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
                                    <button type="submit"  value="Update Profile" class="btn btn-info btn-fill pull-right">Update Profile</button>
                                    <div class="clearfix"></div>
                                </form>

Ich versuche, dies so zu erklären, dass es für Anfänger leichter zu verstehen ist. Achten Sie genau auf die else:

        photo = user_extended.photo
        first_name = user.first_name
        last_name = user.last_name
        address = user_extended.address
        phoneNumber = user_extended.phoneNumber
        form = EditProfileForm(
            initial={'first_name': first_name, 'last_name': last_name,
                                  'address': address, 'phoneNumber': phoneNumber,
                                  'photo': photo}) 

Es ist das, was das Wertattribut erhält, z. B.:

<p><label for="id_first_name">First Name:</label> <input class="form-control" id="id_first_name" name="first_name" type="text" value="Emmanuel" /></p>
<p><label for="id_last_name">Last Name:</label> <input class="form-control" id="id_last_name" name="last_name" type="text" value="Castor" /></p>

2voto

monofonik Punkte 2465

Wenn Sie das Formular mit einer Instanz und nicht mit POST-Daten ausgefüllt haben (wie in der vorgeschlagenen Antwort gefordert), können Sie mit {{ form.instance.my_field_name }} auf die Daten zugreifen.

1voto

namjoo Punkte 1318

Für das Kontrollkästchen mit seinen Elementen:

{% for item in people.q %}
    <div class="form-check form-switch ">
    <label class="form-check-label" for="{{ item.id_for_label }}">{{ item.data.label }}</label>
    <input class="form-check-input" type="checkbox" id="{{ item.id_for_label }}" value="{{ item.data.value }}">
     </div>
{% endfor %}

q ist der Feldname.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X