Django - Der Versuch, eine Instanz eines Modellfeld zu einem Formularfeld passieren

stimmen
0

Ich werde mein Bestes nicht zu klingen wie eine echte Attrappe, aber keine Versprechungen machen. Ich bin ein Sanitäter und ich versuche, eine App zu dokumentieren Einheit prüft electronically.I ein Modellfeld haben, um die Schlüssel zu ein paar andere Modelle in meinem Projekt fremd ist. Dieses Feld bezeichnet die Einheit der Benutzer für diesen Tag der Besetzung. Ich möchte der Anwender das Gerät zu wählen, die er / sie an diesem Tag ist die Besetzung und haben diese Informationen jegliche Form auto-fill für diese Sitzung ausgefüllt. Ich habe versucht, das Objekt mit Sitzungen zu speichern und ich dieses „Objekt des Typs‚MedicUnit‘ist nicht JSON serializable“. Ich habe die model_to_dict Methode verwendet und versucht, die Zeichenfolge der Einheit Namen durch die form_valid Methode zu übergeben, aber ich dieses „Can not assign‚‚Medic 2‘‘:‚‚Beispiel‘ DailyCheck.medic_unit_number MedicUnit‘muss sein“ Ich bin relativ neu in der Programmierung und Django und dies scheint wie ein sehr einfaches Problem zu beheben, aber meine Google-Suche Fähigkeiten sind mich nicht weiter. Hier ist mein Code:

Model.py für den Ursprung des unit_name Modellfeld

class MedicUnit(models.Model):
    unit_name = models.CharField(max_length=50, default='')
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.unit_name

Model.py für eine der Fremdschlüssel verweist auf die unit_name

class DailyCheck(models.Model):
    daily_user = models.ForeignKey(User, on_delete=models.PROTECT)
    record_date = models.DateTimeField(auto_now=True)
    medic_unit_number = models.ForeignKey('components.MedicUnit', related_name='medic_unit_number', on_delete=models.PROTECT, default='')
    unit_property_number = models.ForeignKey('components.Vehicle', related_name='unit_property_number', on_delete=models.PROTECT, default='')
    mileage = models.IntegerField(default=0)
    narc_seal_number = models.IntegerField(default=0)
    emergency_lights = models.BooleanField()
    driving_lights = models.BooleanField()
    red_bag = models.BooleanField()
    LP_15 = models.BooleanField()
    BLS_bag = models.BooleanField()
    RTF_bag = models.BooleanField()
    suction = models.BooleanField()
    oxygen = models.BooleanField()
    free_text = models.TextField(default='')

views.py für das direkt über Modell

def check_home_view(request):
    if request.method == 'POST':
        form = ChooseMedicUnit(request.POST or None)
        if form.is_valid():
            unit_name = form.cleaned_data.get('medic_unit_number')
            request.session['unit_name'] = model_to_dict(unit_name)
            print(request.session['unit_name'])
            return redirect('daily')
    else:
        form = ChooseMedicUnit()
    return render(request, 'checks/checks_home.html', {'form':form})

class checkAdd(CreateView):
    model = DailyCheck
    fields = ['unit_property_number', 'mileage', 'narc_seal_number', 'emergency_lights', 'driving_lights', 'red_bag', 'LP_15', 'BLS_bag', 'RTF_bag', 'suction', 'oxygen', 'free_text']
    success_url = '/checks'

    def form_valid(self, form):
        form.instance.daily_user = self.request.user
        form.instance.medic_unit_number = self.request.session['unit_name']['unit_name']
        return super().form_valid(form)

forms.py

class ChooseMedicUnit(forms.ModelForm):
    class Meta:
        model = DailyCheck
        fields = ['medic_unit_number']
Veröffentlicht am 13/02/2020 um 21:53
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Ich glaube, Sie MedicUnit.id verwenden können. Dies sollte ausreichen, um das Problem der Initialisierung des Feldes aus der Sitzung in anderen Formen zu beheben:

def check_home_view(request):
    if request.method == 'POST':
        form = ChooseMedicUnit(request.POST or None)
        if form.is_valid():
            request.session['unit_name'] = form.cleaned_data.get('medic_unit_number').id  # see here
            print(request.session['unit_name'])
            return redirect('daily')
    else:
        form = ChooseMedicUnit()
    return render(request, 'checks/checks_home.html', {'form':form})
Beantwortet am 13/02/2020 um 22:17
quelle vom benutzer

stimmen
0

Vielen Dank für die Antwort Andrej. Ich werde das auch versuchen. Ich fand, dass alles, was ich zu tun war, hatte das MedicUnit Modell meiner Ansicht importieren und meine form_valid Methode wie folgt zu ändern:

def form_valid(self, form):
        form.instance.daily_user = self.request.user
        form.instance.medic_unit_number = MedicUnit.ojbects.get(pk=self.request.session['unit_name']['id'])
        return super().form_valid(form)

Offenbar können Sitzungen keine Objekte speichern, da nach Django 1.5, denke ich. Jemand kann zu der Tat überprüft mich darauf. So verweisen ich eine Instanz des Objekts mit einem Wörterbuch Wert aus den model_to_dict Daten in der Sitzung mit dem Aufruf MedicUnit.object.get gespeichert.

Wenn Sie das gleiche Problem haben, können Sie die Sitzung Informationen an das Terminal mit einer print-Anweisung drucken wie in meiner check_home_view Funktion Ansicht. Ich habe diese Informationen zu sehen, welche Schlüssel war notwendig Primärschlüsselnummer anzurufen.

Ich werde Andreys Lösung im Laufe des Tages überprüfen und sehen, wie gut das funktioniert. Es scheint ein bisschen sauberer als meine Lösung.

Beantwortet am 14/02/2020 um 13:35
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more