Django - snaží projít instance modelu pole na pole formuláře

hlasů
0

Budu dělat to nejlepší, aby to neznělo jako skutečná figuríny, ale žádné sliby. Jsem zdravotník a já se snažím, aby aplikaci pro dokument jednotkových kontrol electronically.I mít pole modelu, který je cizí klíčem k několika dalšími modely v mém projektu. Toto pole označuje jednotku je uživatel personální obsazení pro daný den. Chci, aby uživatel zvolit jednotku on / ona je personální obsazení, že den a mít tyto informace automatického vyplňování formulářů vyplněných pro danou relaci. Snažil jsem se ukládání objektu pomocí relací a já si to „objekt typu‚MedicUnit‘není JSON serializovatelný“. Použil jsem metodu model_to_dict a pokusil se projít kolem řetězec názvu jednotky přes form_valid metodě, ale já si to „nelze přiřadit‚‚Medic 2‘‘‚‚instance‘ DailyCheck.medic_unit_number‘musí být“ MedicUnit Jsem na programování a Django relativně nový, a to vypadá jako velmi snadný problém opravit, ale moje Google vyhledávání dovednosti se mi nikam. Zde je můj kód:

Model.py pro vznik oblasti unit_name modelu

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 na jeden ze zahraničních klíčových odkazů na 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 pro přímo nad modelem

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']
Položena 13/02/2020 v 23:53
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Myslím, že můžete použít MedicUnit.id. To by mělo stačit k vyřešení problému při inicializaci pole ze zasedání v jiných formách:

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})
Odpovězeno 14/02/2020 v 00:17
zdroj uživatelem

hlasů
0

Děkuji moc za odpověď Andrey. Budu se snažit, aby taky. Zjistil jsem, že všechno, co jsem musel udělat, bylo dovézt model MedicUnit mého pohledu a změnit svůj způsob form_valid následující:

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)

Zřejmě relace nelze ukládat objekty, protože poté, co Django 1.5 myslím. Někdo může mít na skutečnost zkontrolovat mě na to. Tak jsem se odkazoval instanci objektu pomocí slovníku hodnoty z dat model_to_dict uložených v relaci s výzvou MedicUnit.object.get.

Pokud máte stejný problém, můžete si vytisknout informace o relaci do terminálu s prohlášením tisku, stejně jako v mém check_home_view pohledu funkce. Použil jsem tuto informaci zjistit, co klíčem bylo nutné volat číslo primární klíč.

Budu kontrolovat řešení později dnes Andrey a vidět, jak dobře to funguje. Zdá se, že trochu čistší než mé řešení.

Odpovězeno 14/02/2020 v 15:35
zdroj uživatelem

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