Frage Was schließt in der Meta-Klasse von Django aus?


Ich bin auf diesen Code gestoßen:

drinker/models.py:

from django.db import models
from django.db.models.signals import post_save
from django.contrib.auth.models import User

class Drinker(models.Model):
        user            = models.OneToOneField(User)
        birthday        = models.DateField()
        name            = models.CharField(max_length=100)

        def __unicode__(self):
                return self.name

drinker/forms.py:

from django import forms
from django.contrib.auth.models import User
from django.forms import ModelForm
from drinker.models import Drinker

class RegistrationForm(ModelForm):
        username        = forms.CharField(label=(u'User Name'))
        email           = forms.EmailField(label=(u'Email Address'))
        password        = forms.CharField(label=(u'Password'), widget=forms.PasswordInput(render_value=False))
        password1       = forms.CharField(label=(u'Verify Password'), widget=forms.PasswordInput(render_value=False))

        class Meta:
                model = Drinker
                exclude = ('user',)

        def clean_username(self):
                username = self.cleaned_data['username']
                try:
                        User.objects.get(username=username)
                except User.DoesNotExist:
                        return username
                raise forms.ValidationError("That username is already taken, please select another.")

        def clean(self):
                if self.cleaned_data['password'] != self.cleaned_data['password1']:
                        raise forms.ValidationError("The passwords did not match.  Please try again.")
                return self.cleaned_data

Meine Frage betrifft die innere Klasse meta, die als zwei Attribute gilt:

model=Drinker
exclude=('user`,)

Ich habe ein nicht so klares Verständnis davon, wie das geht meta class Arbeit. Ich habe die gelesen documentation aber ich bin immer noch verwirrt. Können Sie mir bitte erklären, was diese beiden Zeilen bedeuten und was ihr Zweck ist? Vielen Dank


5
2018-03-13 18:55


Ursprung


Antworten:


Das exclude Attribut teilt Django mit, welche Felder aus dem Modell stammen nicht in das Formular aufnehmen.

Zitieren der Auswählen der zu verwendenden Felder Abschnitt der Modellformular-Dokumentation:

2. Stellen Sie die exclude Attribut des ModelFormDer inneren Meta-Klasse zu einer Liste von Feldern, die aus dem Formular ausgeschlossen werden sollen.

Das model Die Zeile teilt Django einfach mit, aus welchem ​​Modell die Felder entnommen werden sollen. zusammen sagen die zwei Linien Django zu geben RegistrationForm Felder basierend auf allen Feldern auf der Drinker Modell, außer 'user'. Für das Gegebene Drinker Modell, das ist birthday und name.

Diese Felder werden zu den anderen Formularfeldern hinzugefügt, die bereits im Formular definiert sind. Wenn die Drinker Modell gewann mehr Felder, diese würden automatisch auch Teil des Formulars sein.

Siehe die Überschreiben der Standardfelder Abschnitt desselben Kapitels:

Wenn Sie ein Formularfeld explizit so instanziieren, ist es wichtig zu verstehen, wie ModelForm und regelmäßig Form sind verwandt.

ModelForm ist eine regelmäßige Form welches automatisch bestimmte Felder erzeugen kann. Die Felder, die automatisch generiert werden, sind abhängig vom Inhalt des Meta Klasse und auf welche Felder bereits deklarativ definiert wurden. Grundsätzlich gilt, ModelForm erzeugt nur Felder, die im Formular fehlen, oder Felder, die nicht deklarativ definiert wurden.

Das Innere Meta class ist nur eine bequeme Möglichkeit, einen Namespace für eine solche Konfiguration in Ihrer Formularklasse zu erstellen, damit das Django-Framework sie finden kann. Alles, was Django jetzt tun muss, ist introspektiv Form.Meta und sehen, welche Attribute dort definiert sind.

Beachten Sie, dass mit exclude kann zu Sicherheitsproblemen führen. Aus derselben Dokumentation:

Es wird dringend empfohlen, dass Sie alle Felder, die in dem Formular bearbeitet werden sollen, explizit mit dem Attribut fields festlegen. Wenn dies nicht möglich ist, kann dies leicht zu Sicherheitsproblemen führen, wenn ein Formular dem Benutzer unerwartet die Festlegung bestimmter Felder erlaubt, insbesondere wenn neue Felder zu einem Modell hinzugefügt werden. Abhängig davon, wie das Formular gerendert wird, ist das Problem möglicherweise nicht einmal auf der Webseite sichtbar.

Der alternative Ansatz wäre, alle Felder automatisch einzuschließen oder nur einige zu sperren. Dieser grundlegende Ansatz ist bekanntermaßen viel weniger sicher und hat auf großen Websites (z. GitHub).


7
2018-03-13 18:56



Kurz gesagt: Felder, die Sie im Formular anzeigen möchten, sollten im Attribut 'fields' erwähnt werden:

fields = '__all__'  #will show all the fields from the model in the form

"Ausschließen" macht das Gegenteil

 exclude = ['title'] # don't show the title field

0
2018-03-20 12:00



fields = exclude() and fields = '__all__'  - bedeutet, alle Felder anzuzeigen

exclude = ('password',) - bedeutet, Passwortfeld ausschließen

fields = ('user','email',)  - bedeutet nur E-Mail-Feld und Benutzerfeld anzeigen


0
2017-12-30 09:43