bga*_*ial 1 python django django-models django-forms
我正在使用forms(forms.ModelForm),当我在模型中创建表单时,我有一点不方便.我的情况如跟在我的models.py文件中:
我有这个CorporalSegment型号:
class CorporalSegment(models.Model):
    SEGMENTO_HOMBRO = 'Hombro'
    SEGMENTO_CODO = 'Codo'
    SEGMENTO_ANTEBRAZO = 'Antebrazo'
    SEGMENTO_MANO = 'Mano'
    SEGMENT_CHOICES = (
        (SEGMENTO_HOMBRO, u'Hombro'),
        (SEGMENTO_CODO, u'Codo'),
        (SEGMENTO_ANTEBRAZO, u'Antebrazo'),
        (SEGMENTO_MANO, u'Mano'),
    )
    corporal_segment = models.CharField(
        max_length=12,
        choices=SEGMENT_CHOICES,
        blank=False,
    )
    class Meta:
        verbose_name_plural = 'Segmentos Corporales'
    def __str__(self):
        return "%s" % self.corporal_segment
我有Movement模特
class Movements(models.Model):
    name = models.CharField(
        max_length=255,
        verbose_name='Movimiento'
    )
    class Meta:
        verbose_name_plural = 'Movimientos'
    def __str__(self):
        return "%s" % self.name
我有Metric模特
class Metrics(models.Model):
    name = models.CharField(
        max_length=255,
        blank=True,
        verbose_name='Nombre'
    )
    value = models.DecimalField(
        max_digits = 5,
        decimal_places = 3,
        verbose_name = 'Valor',
        null = True,
        blank = True
    )
    class Meta:
        verbose_name = 'Métrica'
    def __str__(self):
        return "{},{}".format(self.name, self.value)
我的目的是,在一种形式,我可以节省的多值(实例)CorporalSegment,Movement以及Metric模型,并且由于这一点,我有PatientMonitoring这种方式的模型:
class PatientMonitoring(models.Model):
    patient = models.ForeignKey(...)
    medical = models.ForeignKey(...)
    # My fields pointing to my previous models with many to many relationship
    corporal_segment = models.ManyToManyField(CorporalSegment, verbose_name='Segmentos Corporales')
    movement = models.ManyToManyField(Movements, verbose_name='Movimientos')
    metrics = models.ManyToManyField(Metrics, verbose_name='Métricas', )
    class Meta:
        verbose_name = 'Monitoreo del paciente'
    def __str__(self):
        return "%s" % self.patient
我的views.py档案
class PatientMonitoringCreate(CreateView):
    model = PatientMonitoring
    form_class = PatientMonitoringForm
    success_url = reverse_lazy('patientmonitoring:list')
class PatientMonitoringUpdate(UpdateView):
    model = PatientMonitoring
    form_class = PatientMonitoringForm
    success_url = reverse_lazy('patientmonitoring:list')
我forms.py是这样的:
from django import forms
from .models import PatientMonitoring
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit
class PatientMonitoringForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PatientMonitoringForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.add_input(Submit('submit', u'Save'))
    # I think so that here is my problem ...
    def save(self, commit=True):
        patient_monitoring = super(PatientMonitoringForm, self).save(commit=False)
        patient = self.cleaned_data['patient']
        if commit:
            patient_monitoring.save()
        return patient_monitoring
    class Meta:
        model = PatientMonitoring
        fields = ['patient', 'medical','corporal_segment','movement','metrics']
我的模板patientmonitoring_form.html是:
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block title %}Crear Registro de Monitoreo de Paciente{% endblock %}
{% block content %}
<div>
    {% crispy form %}
    {% csrf_token %}
</div>
{% endblock %}
当我想PatientMonitoring以各自的形式保存一个实例,表格中的corporal_segment(Segmentos Corporales)movement(Movimientos)和metrics(Metricas)字段时,它们的值不会保存在表格中(方块为红色),而是保存另一个字段(不是红色平方)
这种行为对我来说很奇怪,因为通过Django管理表单,可以保存PatientMonitoring具有所有属性的实例.
save在我PatientMonitoringForm的forms.py文件中保存我的表单方法时,我会忽略什么?
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method
使用commit = False时,必须调用save_m2m()
m2m关系需要首先保存父对象,而不是使用commit = False进行保存.
| 归档时间: | 
 | 
| 查看次数: | 312 次 | 
| 最近记录: |