Джанго - Попытка передать экземпляр поля модели в поле формы

голоса
0

Я не буду делать все возможное, чтобы не звучать как настоящий манекен, но никаких обещаний. Я медработник, и я пытаюсь сделать приложение для единичных документов проверки electronically.I есть поле модели, которая чужда шпонка на несколько других модели в моем проекте. Это поле обозначает единицу пользователь штатное расписание на этот день. Я хочу, чтобы пользователь, чтобы выбрать устройство, он / она штатное расписание в тот же день и есть эта информация автоматически заполнить любые формы, заполненные на эту сессию. Я пытался сохранять объект с помощью сеансов и я получаю этот «объект типа„MedicUnit“не является JSON сериализации». Я использовал метод model_to_dict и попытался передать строку имени блока через form_valid метод, но я получаю это «Не может назначить„Медик 2“: „„ Экземпляр“DailyCheck.medic_unit_number“ должно быть»MedicUnit Я относительно новый для программирования и Django, и это кажется очень простой проблемой исправить, но мои навыки поиска Google не получает меня в любом месте. Вот мой код:

Model.py для возникновения поля 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 для одного из ключевых зарубежных ссылок на 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 для модели непосредственно над

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']
Задан 13/02/2020 в 23:53
источник пользователем
На других языках...                            


2 ответов

голоса
0

Я думаю, что вы можете использовать MedicUnit.id. Этого должно быть достаточно, чтобы решить проблему инициализации поля из сессии в других формах:

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})
Ответил 14/02/2020 в 00:17
источник пользователем

голоса
0

Огромное спасибо за ответ Андрей. Я постараюсь это тоже. Я обнаружил, что все, что я должен был сделать импортировать модель MedicUnit на мой взгляд, и изменить свой form_valid метод следующим образом:

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)

По-видимому сеансов не может хранить объекты, так как после того, как Django 1.5, я думаю. Кто-то, возможно, придется проверить то, меня на это. Поэтому я ссылается экземпляр объекта со словарем значения из данных, хранящихся в model_to_dict сессии с вызовом MedicUnit.object.get.

Если у Вас есть такая же проблема, вы можете распечатать данные сеанса терминала с оператором печати так же, как в моей check_home_view зрения функции. Я использовал эту информацию, чтобы увидеть, что ключ необходимо вызвать номер первичного ключа.

Я проверю решение позже сегодня Андрей и посмотреть, насколько хорошо это работает. Это кажется немного чище, чем мое решение.

Ответил 14/02/2020 в 15:35
источник пользователем

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