[PYTHON] Django Treffen Sie Ihre Auswahl nur für die Einrichtung, zu der Sie gehören

Die Entwicklung verläuft im gleichen Tempo wie zuvor, aber ich konnte nichts posten.

Dieses Mal werde ich bei der Registrierung versuchen, nur das Geschäft auszuwählen, zu dem ich gehöre. Dies soll verhindern, dass Sie versehentlich eine gewünschte Schicht auswählen, wenn Sie eine gewünschte Schicht registrieren, obwohl Sie nur zu Pu-a-Pu gehören.

Vor der Korrektur

image.png

Als ich es nachgeschlagen habe, konnte ich damit umgehen, indem ich forms.py und Ansichten hinzufügte.

views.py


    def get_form_kwargs(self):
        kwargs = super(KibouCreate, self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

Ich habe das Bild nicht erfasst, weil ich es selbst mache, aber wenn ich die Formularinformationen erhalte, stelle ich mir vor, dass ich meine eigenen Informationen weitergeben, das Ergebnis vom Formular verarbeiten und an HTML zurücksenden werde. Ich werde.

forms.py


class kibouCreateForm(forms.ModelForm):
    class Meta:
        shift_object = Shift.objects.all()
        model = KibouShift
        fields = ('user', 'date', 'shift_name_1', 'shisetsu_name_1', 'shift_name_2', 'shisetsu_name_2', 'shift_name_3', 'shisetsu_name_3', 'shift_name_4', 'shisetsu_name_4')
        widgets = {
            'date': datetimepicker.DatePickerInput(
            format='%Y-%m-%d',
            options={
                'locale': 'ja',
                'dayViewHeaderFormat': 'JJJJ Jahr MMMM',
                'ignoreReadonly': True,
                'allowInputToggle': True,
                }
            ),
        }
    def __init__(self, *args, **kwargs):
        #Es kann nur die Zugehörigkeitsliste ausgewählt werden
        user = kwargs.pop('user')
        UserShozoku_list = UserShozokuModel.objects.filter(user = user.id).values_list("shisetsu_name", flat=True)
        UserShozoku_list = list(UserShozoku_list)
        super(kibouCreateForm, self).__init__(*args, **kwargs)
        self.fields['shisetsu_name_1'].queryset = Shisetsu.objects.filter(id__in = UserShozoku_list).all()
        self.fields['shisetsu_name_2'].queryset = Shisetsu.objects.filter(id__in = UserShozoku_list).all()
        self.fields['shisetsu_name_3'].queryset = Shisetsu.objects.filter(id__in = UserShozoku_list).all()
        self.fields['shisetsu_name_4'].queryset = Shisetsu.objects.filter(id__in = UserShozoku_list).all()

    """
Fristprüfung
    """
    def clean_date(self):
        dt_now = datetime.datetime.now()
        dt_date = self.cleaned_data.get('date')
        #Geben Sie erst nach dem 20. als 5. ein
        if dt_now.day > 5:
            startdate = datetime.date(dt_now.year,dt_now.month,20) + relativedelta(months=1)
            if dt_date < startdate:
                raise forms.ValidationError(
                "Die Frist ist abgelaufen. Bitte wenden Sie sich an den Administrator.",
                )
        else:
            startdate = datetime.date(dt_now.year,dt_now.month,20)
            if dt_date < startdate:
                raise forms.ValidationError(
                "Die Frist ist abgelaufen. Bitte wenden Sie sich an den Administrator.",
                )
        return self.cleaned_data.get('date')
    def clean(self):

        ############
        #überprüfen
        ############
        dt_user = self.cleaned_data.get('user')
        dt_date = self.cleaned_data.get('date')
        if KibouShift.objects.filter(user=dt_user, date=dt_date).count() > 0:
            raise forms.ValidationError("Ich kann mich nicht registrieren, da die gewünschte Schicht am selben Tag bereits registriert wurde. Bitte korrigiere es.")

        dt_shift_name1 = self.cleaned_data.get('shift_name_1')
        dt_shift_name2 = self.cleaned_data.get('shift_name_2')
        dt_shift_name3 = self.cleaned_data.get('shift_name_3')
        dt_shift_name4 = self.cleaned_data.get('shift_name_4')
        dt_shisetsu_name_1 = self.cleaned_data.get('shisetsu_name_1')
        dt_shisetsu_name_2 = self.cleaned_data.get('shisetsu_name_2')
        dt_shisetsu_name_3 = self.cleaned_data.get('shisetsu_name_3')
        dt_shisetsu_name_4 = self.cleaned_data.get('shisetsu_name_4')
        #Wenn die Schicht geschlossen ist, bleibt die Einrichtung leer
        if str(dt_shift_name1) == "Geschlossen" or str(dt_shift_name1) == "Ja" or str(dt_shift_name1) == "Nicht":
            if dt_shift_name2 != None or dt_shift_name3 != None or dt_shift_name4 != None or dt_shisetsu_name_1 != None or dt_shisetsu_name_2 != None or dt_shisetsu_name_3 != None or dt_shisetsu_name_4 != None:
                raise forms.ValidationError("Für die Schichten "Urlaub", "Ja" und "Nein" ist keine weitere Eingabe erforderlich.")

Dann image.png

Es ist jetzt nur die Einrichtung, zu der ich gehöre.

Übrigens möchte ich die Benutzerauswahl nur für diejenigen ermöglichen, die die Berechtigung haben, Zeitpläne hinzuzufügen.

Ich habe nur ein bisschen hinzugefügt. Trotzdem habe ich es ungefähr eine Stunde lang recherchiert und implementiert (lacht)

Ursprünglich denke ich, dass es am besten ist, für jeden ausgewählten Benutzer eine Einrichtung auswählen zu können, aber es ist notwendig, beispielsweise eine Implementierung mit Javascript oder das Abrufen per Knopfdruck zu entwickeln.

Sie müssen Ihre Fähigkeiten in Zukunft verbessern.

forms.py


    def __init__(self, *args, **kwargs):
        #Es kann nur die Zugehörigkeitsliste ausgewählt werden
        user = kwargs.pop('user')
        UserShozoku_list = UserShozokuModel.objects.filter(user = user.id).values_list("shisetsu_name", flat=True)
        UserShozoku_list = list(UserShozoku_list)
        super(kibouCreateForm, self).__init__(*args, **kwargs)
        self.fields['shisetsu_name_1'].queryset = Shisetsu.objects.filter(id__in = UserShozoku_list).all()
        self.fields['shisetsu_name_2'].queryset = Shisetsu.objects.filter(id__in = UserShozoku_list).all()
        self.fields['shisetsu_name_3'].queryset = Shisetsu.objects.filter(id__in = UserShozoku_list).all()
        self.fields['shisetsu_name_4'].queryset = Shisetsu.objects.filter(id__in = UserShozoku_list).all()

        #Es ist besser, für jeden ausgewählten Benutzer zu ändern, aber es ist notwendig, Java-Skript oder -Schaltfläche zu erhalten und damit zu arbeiten
        #Ändern Sie die Benutzerauswahl, wenn Sie zum Hinzufügen eines Zeitplans berechtigt sind
        permissions = Permission.objects.filter(user=user)
        if user.has_perm('schedule.add_KibouShift'):
            self.fields['user'].queryset = CustomUser.objects.all()
        else:
            self.fields['user'].queryset = CustomUser.objects.filter(username=user.username).all()

Ich habe es übrigens in CustomUser anstelle des ursprünglich vorbereiteten Benutzerobjekts geändert. Ich habe die Datenbank gelöscht und von vorne begonnen, sodass die Daten gleich wurden.

Recommended Posts

Django Treffen Sie Ihre Auswahl nur für die Einrichtung, zu der Sie gehören
Django-Schichttabelle Zeigen Sie nur die Einrichtungen an, zu denen Sie gehören
So registrieren Sie nur eine Daten auf dem Django-Verwaltungsbildschirm
django + nginx So lassen Sie nur angemeldete Benutzer Bilder anzeigen
Stellen Sie das Django-Lernprogramm für IIS bereit ①
Starten Sie Django zum ersten Mal
Der einfachste Weg, eine Flasche herzustellen
Ein Shell-Skript, um sich wieder an die pipenv-Shell zu erinnern
Ab Django 1.8 können Sie ein aufrufbares Objekt an das Auswahlattribut von forms.ChoiceField übergeben, was sehr praktisch ist.
So überprüfen Sie die Version von Django
Holen Sie sich nur den Text aus dem Django-Formular.
Wiederholen Sie alles für den Django-Anmeldebildschirm
Ich habe versucht, die Einstellungen für verschiedene Datenbanken von Django (MySQL, PostgreSQL) zusammenzufassen.
Wenn Sie eine TODO-Anwendung (verteilt) jetzt nur mit Python erstellen möchten
Verwenden Sie Pillow, um das Bild transparent zu machen und nur einen Teil davon zu überlagern