Я работаю с формами (forms.ModelForm
), и у меня есть небольшое неудобство при создании моей формы, основанной на моделях. Моя ситуация такая, как следовать в моем models.py
файле:forms.ModelForm не сохраняет поля ManyToMany
У меня есть 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
My имеет таким образом:
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
я s:
{% 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
файла?