Django - Cercando di passare un'istanza di un campo modello a un campo modulo

voti
0

Ho intenzione di fare del mio meglio per non suono come un vero e proprio manichino, ma niente promesse. Io sono un paramedico e sto cercando di fare un app per i controlli delle unità documento electronically.I avere un campo modello che è estraneo a chiave ad alcuni altri modelli nel mio progetto. Questo campo indica l'unità l'utente è di personale per quel giorno. Voglio all'utente di scegliere l'unità di lui / lei è di personale quel giorno e che hanno informazioni di auto-compilare eventuali moduli compilati per quella sessione. Ho provato memorizzare l'oggetto utilizzando le sessioni e ottengo questo oggetto di tipo 'MedicUnit' non è JSON serializzabile. Ho usato il metodo model_to_dict e ho cercato di passare la stringa del nome dell'unità attraverso il metodo form_valid ma ottengo questo Impossibile assegnare ' 'Medic 2'': ' ' istanza' DailyCheck.medic_unit_number' deve essere un MedicUnit Sono relativamente nuovo per la programmazione e Django e questo mi sembra un problema molto facile da risolvere, ma le mie capacità Google che cerca non mi sono sempre ovunque. Ecco il mio codice:

Model.py per l'origine del campo Modello 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 per uno dei riferimenti chiave esterna alla 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 per il modello direttamente sopra

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']
È pubblicato 13/02/2020 alle 23:53
fonte dall'utente
In altre lingue...                            


2 risposte

voti
0

Penso che si possa utilizzare MedicUnit.id. Questo dovrebbe essere sufficiente a risolvere il problema di inizializzazione del campo dalla sessione in altre forme:

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})
Risposto il 14/02/2020 a 00:17
fonte dall'utente

voti
0

Grazie mille per la risposta Andrey. Cercherò anche questo. Ho scoperto che tutto quello che dovevo fare era importare il modello MedicUnit al mio punto di vista e cambiare il mio metodo form_valid al seguente:

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)

A quanto pare le sessioni non possono memorizzare oggetti dal momento che dopo Django 1,5 penso. Qualcuno potrebbe essere necessario infatti che controllo su questo. Così ho fatto riferimento un'istanza dell'oggetto con un valore di dizionario in base ai dati model_to_dict memorizzati nella sessione con la chiamata MedicUnit.object.get.

Se si hanno lo stesso problema, è possibile stampare le informazioni di sessione per il terminale con un comunicato stampa, proprio come a mio avviso la funzione check_home_view. Ho usato queste informazioni per vedere che cosa chiave è stato necessario chiamare il numero di chiave primaria.

Controllerò soluzione entro oggi di Andrey e vedere quanto bene che funziona. Mi sembra un po 'più pulito di quanto la mia soluzione.

Risposto il 14/02/2020 a 15:35
fonte dall'utente

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