Django добавление данных из нескольких форм одной модели в базу данных - PullRequest
0 голосов
/ 20 января 2019

У меня есть одна модель измерения, две формы MeassurementSystolicPressureForm и MeassurementDiastolicPressureForm.Я хочу сделать представление, которое позволяет пользователю добавлять их обоих в базу данных.У каждого есть поля: имя пользователя, дата измерения, значение, тип измерения.Когда я заполняю формы на своей веб-странице, в БД добавляются две записи, каждая из которых имеет хорошее имя пользователя и тип измерения, но дата и значение измерения одинаковы для обеих записей.Можете ли вы помочь мне определить, что я делаю неправильно?

Вот мой код:

models.py

class Measurement(models.Model):
    value = models.IntegerField()
    measurement_type = models.CharField(max_length=6, default='measurement', blank=True)
    username = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    measurement_date = models.DateTimeField(default=datetime.now, editable=True)

forms.py

class MeassurementSystolicPressureForm(ModelForm):
    class Meta:
        model = Measurement
        fields = ['value',  'measurement_date']


class MeassurementDiastolicPressureForm(ModelForm):
    class Meta:
        model = Measurement
        fields = ['value', 'measurement_date']

views.py

def new_measurement(request):
    if request.method == 'POST':
        form_SP = MeassurementSystolicPressureForm(request.POST or None)
        form_DP = MeassurementDiastolicPressureForm(request.POST or None)
        if form_CS.is_valid() or form_CR.is_valid():

            temp_S = form_SP.save(commit=False)
            temp_S.username = request.user
            temp_S.measurement_type = 'syspres'
            temp_S.save()

            temp_D = form_DP.save(commit=False)
            temp_D.username = request.user
            temp_D.measurement_type = 'diapres'
            temp_D.save()

            return redirect('/')
    else:
        form_SP = MeassurementSystolicPressureForm()
        form_DP = MeassurementDiastolicPressureForm()
        args = {'form_SP': form_SP, 'form_DP': form_DP}
        return render(request, 'measurements.html', args)

Если, например, я отправляю данные для:

Systolic Pressure:
value: 120 
date: 2019-01-15 16:15:32
Diastolic Pressure:
value: 80
date: 2019-01-15 15:00:00`

В моей базе данных есть две записи:

username: Julka, measurement_type: 
syspres, value: 80, date: 2019-01-15 15:00:00
username: Julka, measurement_type: diapres, value: 80, date: 2019-01-15 15:00:00

Я понятия не имею, что делать.

1 Ответ

0 голосов
/ 20 января 2019

В объекте HttpRequest атрибуты GET и POST являются экземплярами django.http.QueryDict. Один только этот тип не может определить, какая форма была отправлена. Ваши формы имеют одинаковые поля, поэтому одна форма действительна, другая форма также действительна. Вот почему у вас есть измерение-дата и значение одинаковы для обеих записей. Чтобы решить эту проблему, вы можете добавить дополнительные скрытые поля в свои формы и посмотреть, из какой формы они были отправлены. Некоторым нравится это:

class MeassurementSystolicPressureForm(ModelForm):
    flag_Systolic = forms.IntegerField()
    class Meta:
        model = Measurement
        fields = ['value',  'measurement_date']
    def __init__(self, *args, **kwargs):
        super(MeassurementSystolicPressureForm, self).__init__(*args, **kwargs)
        self.fields['flag_Systolic'].widget = forms.HiddenInput()


class MeassurementDiastolicPressureForm(ModelForm):
    flag_Diastolic = forms.IntegerField()
    class Meta:
        model = Measurement
        fields = ['value', 'measurement_date']
    def __init__(self, *args, **kwargs):
        super(MeassurementDiastolicPressureForm, self).__init__(*args, **kwargs)
        self.fields['flag_Diastolic'].widget = forms.HiddenInput()

и по вашему мнению:

def new_measurement(request):
    if request.method == 'POST':
        if 'flag_Systolic' in request.POST:
            form_SP = MeassurementSystolicPressureForm(request.POST)
            if form_SP.is_valid():
                temp_S = form_SP.save(commit=False)
                temp_S.username = request.user
                temp_S.measurement_type = 'syspres'
                temp_S.save()
                return redirect('/')
        elif 'flag_Diastolic' in request.POST:
            form_DP = MeassurementDiastolicPressureForm(request.POST)
            if form_DP.is_valid():
                temp_D = form_DP.save(commit=False)
                temp_D.username = request.user
                temp_D.measurement_type = 'diapres'
                temp_D.save()
                return redirect('/')
    else:
        form_SP = MeassurementSystolicPressureForm()
        form_DP = MeassurementDiastolicPressureForm()
        args = {'form_SP': form_SP, 'form_DP': form_DP}
        return render(request, 'measurements.html', args)
...