Django - próba przekazania wystąpienie pola modelu w postaci pola

głosy
0

Mam zamiar zrobić w mojej mocy, aby nie brzmieć jak realnego manekina, ale nie obiecuje. Jestem ratownikiem medycznym i próbuję złożyć aplikację do kontroli jednostkowych dokument electronically.I mieć pole modelu, który jest obcy nadwozia do kilku innych modeli w moim projekcie. To pole określa jednostkę użytkownik Rekrutacja na ten dzień. Chcę użytkownikowi wybrać jednostkę on / ona Rekrutacja że dzień i mieć te informacje automatycznie wypełniać żadnych formularzy wypełnionych dla tej sesji. Próbowałem przechowywania obiektu przy sesjach i otrzymuję ten „obiekt typu«MedicUnit»nie jest JSON serializacji”. Użyłem metody model_to_dict i starał się przekazać ciąg nazwy jednostki za pomocą metody form_valid ale mam to „Nie można przypisać««Medic 2»»:««Instancja» DailyCheck.medic_unit_number»musi być” MedicUnit Jestem stosunkowo nowy w programowaniu i Django i wydaje się to bardzo łatwo naprawić problemu, ale moje umiejętności wyszukiwania Google nie są coraz mnie wszędzie. Tu jest mój kodu:

Model.py o pochodzeniu dziedzinie modelu unit_name

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 dla jednego z kluczy obcych odniesień do 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 dla bezpośrednio powyżej modelu

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']
Utwórz 13/02/2020 o 21:53
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

Myślę, że można użyć MedicUnit.id. To powinno być wystarczające, aby rozwiązać problem inicjalizacji pola z sesji w innych formach:

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})
Odpowiedział 13/02/2020 o 22:17
źródło użytkownik

głosy
0

Dziękuję bardzo za odpowiedź Andrey. Postaram się, że zbyt. Okazało się, że wszystko, co musiałem zrobić, to import modelu MedicUnit do mojego widoku i zmienić form_valid sposób na następujące kwestie:

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)

Widocznie sesje nie można przechowywać obiektów, ponieważ po Django 1.5 myślę. Ktoś może mieć do rzeczywistości sprawdzić mnie w tej sprawie. Więc odwołuje instancję obiektu ze słownikiem wartości z danymi model_to_dict przechowywanych w sesji z wezwaniem MedicUnit.object.get.

Jeśli masz ten sam problem, można wydrukować informacje o sesji do terminala z oświadczeniem druku, podobnie jak w moim check_home_view widzenia funkcji. Kiedyś te informacje, aby zobaczyć, co było konieczne, aby klucz wywołać numer klucza podstawowego.

Będę sprawdzić rozwiązanie później dzisiaj Andrey i zobaczyć, jak to działa. Wydaje się czystsze niż mój bitowe rozwiązania.

Odpowiedział 14/02/2020 o 13:35
źródło użytkownik

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