Django将一个模型的多种形式的数据添加到数据库中

Django将一个模型的多种形式的数据添加到数据库中,django,django-models,django-forms,django-views,multiple-forms,Django,Django Models,Django Forms,Django Views,Multiple Forms,我有一个模型测量,两个模型测量系统压力和舒张压。我想创建一个视图,允许用户将它们添加到数据库中。每个字段都有:用户名、测量日期、值、测量类型。当我在我的网页上填写表格时,两个记录被添加到数据库中,每个记录都有一个好的用户名和度量值类型,但是两个记录的度量值和日期都是相同的。你能帮我找出我做错了什么吗 这是我的密码: 型号.py class Measurement(models.Model): value = models.IntegerField() measurement_ty

我有一个模型测量,两个模型测量系统压力和舒张压。我想创建一个视图,允许用户将它们添加到数据库中。每个字段都有:用户名、测量日期、值、测量类型。当我在我的网页上填写表格时,两个记录被添加到数据库中,每个记录都有一个好的用户名和度量值类型,但是两个记录的度量值和日期都是相同的。你能帮我找出我做错了什么吗

这是我的密码:

型号.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)
class MeassurementSystolicPressureForm(ModelForm):
    class Meta:
        model = Measurement
        fields = ['value',  'measurement_date']


class MeassurementDiastolicPressureForm(ModelForm):
    class Meta:
        model = Measurement
        fields = ['value', 'measurement_date']
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)
forms.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)
class MeassurementSystolicPressureForm(ModelForm):
    class Meta:
        model = Measurement
        fields = ['value',  'measurement_date']


class MeassurementDiastolicPressureForm(ModelForm):
    class Meta:
        model = Measurement
        fields = ['value', 'measurement_date']
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)
视图.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)
class MeassurementSystolicPressureForm(ModelForm):
    class Meta:
        model = Measurement
        fields = ['value',  'measurement_date']


class MeassurementDiastolicPressureForm(ModelForm):
    class Meta:
        model = Measurement
        fields = ['value', 'measurement_date']
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

我不知道该怎么办。

在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)

我知道这可能太晚了,但这可能对其他面临同样问题的人有所帮助

一个更简单的解决方案是在视图中创建对象并将其传递给两种形式:

from .models import Measurement
def new_measurement(request):
    user=request.user                       #the authenticated user
    if request.method == 'POST':
        measurement=Measurement(username=user)
        form_SP = MeassurementSystolicPressureForm(request.POST or None, instance=measurement)
        form_DP = MeassurementDiastolicPressureForm(request.POST or None, instance=measurement)
        if form_CS.is_valid() or form_CR.is_valid():
            form_CS.save()
            form_CR.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)

当你可以用一个表单做同样的事情时,为什么你要用两个表单呢?而
form_CS
form_CR
是在哪里定义的?在这两个字段上获得相同的
date
,是因为您已在模型中为其设置了默认值,并且未在视图中更改它。同样的情况也发生在
value
如果form\u CS.is\u valid()或form\u CR.is\u valid(),您还没有定义这两个
并且正如上面的评论中正确提到的,您的日期得到了默认值。