Django - Tratando de pasar una instancia de un campo de modelo para un campo de formulario

votos
0

Voy a hacer todo lo posible para no sonar como un muñeco real, pero sin promesas. Soy un paramédico y yo estoy tratando de hacer una aplicación a la unidad de cheques documento electronically.I tener un campo modelo que es extranjera con llave a algunos otros modelos en mi proyecto. Este campo designa la unidad que el usuario está de personal para ese día. Quiero que el usuario elija la unidad que él / ella está de personal que día y tener esa información de auto-llenar los formularios rellenados para esa sesión. He intentado almacenar el objeto utilizando sesiones y consigo este objeto de tipo 'MedicUnit' no es JSON serializable. He utilizado el método model_to_dict y trató de pasar la cadena del nombre de la unidad a través del método form_valid pero me sale esto no podrá asignar ' 'Medic 2'': ' ' instancia' DailyCheck.medic_unit_number' debe ser un MedicUnit Soy relativamente nuevo en la programación y el Django y éste parece ser un problema muy fácil de solucionar, pero mis habilidades de búsqueda Google no está recibiendo a ninguna parte. Aquí está mi código:

Model.py para el origen del campo del modelo 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 para una de las referencias claves externas con las 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 para el modelo directamente encima

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']
Publicado el 13/02/2020 a las 23:53
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Creo que se puede utilizar MedicUnit.id. Esto debería ser suficiente para resolver el problema de inicializar el campo de la sesión en otras formas:

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})
Respondida el 14/02/2020 a las 00:17
fuente por usuario

votos
0

Muchas gracias por la respuesta Andrei. Voy a tratar de eso también. Me encontré con que todo lo que tenía que hacer era importar el modelo MedicUnit a mi modo de ver y cambiar mi método form_valid a lo siguiente:

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)

Al parecer, las sesiones no pueden almacenar los objetos ya que después de Django 1.5 creo. Alguien puede tener que comprobar hecho de mí en eso. Así que hice referencia a una instancia del objeto con un valor diccionario partir de los datos almacenados en model_to_dict la sesión con la llamada MedicUnit.object.get.

Si tiene el mismo problema, puede imprimir la información de la sesión con el terminal con una declaración de impresión al igual que en mi opinión función check_home_view. He utilizado esa información para ver qué clave fue necesario llamar al número de clave primaria.

Voy a comprobar más tarde hoy solución de Andrey y ver lo bien que funciona. Parece un poco más limpio que mi solución.

Respondida el 14/02/2020 a las 15:35
fuente por usuario

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