我正在尝试使用同一页面保存两个表单,为此我创建了一个表单集。我以前和森林一起工作过,但这次我一直收到一个错误,告诉我表单数据没有验证,我似乎无法找到问题。
这是mi views.py(编辑)
def mensajenuevo(request, idDoctor):
usuario = Doctores.objects.filter(user=request.user)
instance = get_object_or_404(Doctores, idDoctor=idDoctor)
doctoresu = Doctores.objects.get(user=request.user)
doctor = doctoresu.idDoctor
pacientes = PacientesDoctores.objects.raw('SELECT idPacientesDoctores,idPaciente_id,idDoctor_id,Vitalis_pacientes.Nombre,Vitalis_pacientes.Apellidos FROM Vitalis_pacientesdoctores INNER JOIN Vitalis_pacientes ON Vitalis_pacientesdoctores.idPaciente_id=Vitalis_pacientes.idPaciente WHERE idDoctor_id=%s', [doctor])
formchat = ChatForm()
formmensaje = MensajeForm()
if request.method == "POST":
formchat = ChatForm(request.POST)
formmensaje = MensajeForm(request.POST)
if formchat.is_valid():
chat = formchat.save(commit=False)
chat.idDoctor = instance
chat.idPaciente = Pacientes.objects.get(idPaciente=1)
chat.save()
if formmensaje.is_valid():
mensaje = formmensaje.save(commit=False)
mensaje.idChat = formchat.idChat
mensaje.Receptor = request.POST.get("paciente", "")
mensaje.Emisor = instance
mensaje.FechaMensaje = datetime.today()
mensaje.HoraMensaje = datetime.now()
mensaje.save()
return HttpResponseRedirect("/doctor/")
context = ({"usuario": usuario, "pacientes": pacientes, "formchat": formchat, "formmensaje": formmensaje})
return render(request, "vitalis/mensajenuevo.html", context)
两个forms.py
class ChatForm(forms.ModelForm):
class Meta:
model = Chat
exclude = ["idDoctor", "idPaciente"]
class MensajeForm(forms.ModelForm):
class Meta:
model = Mensajes
exclude = ["Emisor", "Receptor", "FechaMensaje", "HoraMensaje", "Leido"]
widgets = {
'Sujeto': forms.TextInput(attrs={'class':'form-control'}),
'Mensaje': forms.Textarea(attrs={'class':'form-control'}),
}
def __init__(self, *args, **kwargs):
kwargs.setdefault("label_suffix", "")
super(MensajeForm, self).__init__(*args, **kwargs)
self.fields['Sujeto'].error_messages = {'required': 'El mensaje debe llevar un sujeto.'}
self.fields['Mensaje'].error_messages = {'required': 'Debes enviar un mensaje.'}
models.py
class Chat(models.Model):
idChat = models.AutoField(primary_key=True, null=False, max_length=15)
idDoctor = models.ForeignKey(Doctores)
idPaciente = models.ForeignKey(Pacientes)
class Mensajes(models.Model):
idMensaje = models.AutoField(primary_key=True, null=False, max_length=15)
idChat = models.ForeignKey(Chat)
Emisor = models.CharField(max_length=20)
Receptor = models.CharField(max_length=20)
Sujeto = models.CharField(max_length=200)
Mensaje = models.TextField(max_length=5000)
FechaMensaje = models.DateField()
HoraMensaje = models.TimeField()
Leido = models.CharField(max_length=2, default="No")
最后是模板
<form method="post" action="">
{% csrf_token %}
<div class="row">
<div class="col-sm-6 col-lg-6 casilla">
<div class="form-group">
<label for="Paciente" class="col-md-3 control-label">Para</label>
<div class="col-md-8">
<select id="Paciente" name="paciente" class="selectpicker form-control" data-live-search="true">
<option>Seleccione uno</option>
{% for paciente in pacientes %}
<option value="{{ paciente.idPaciente }}">{{ paciente.Nombre }} {{ paciente.Apellidos }}</option>
{% endfor %}
</select>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-6 col-lg-6 casilla">
<div class="form-group">
<label for="Sujeto" class="col-md-3 control-label">Sujeto</label>
<div class="col-md-8">
{{ formmensaje.Sujeto }}
{{ formmensaje.Sujeto.errors }}
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-lg-12 casilla center-block">
<div class="form-group">
<label for="Mensaje" class="col-md-2 control-label">Mensaje</label>
<div class="col-sm-12">
{{ formmensaje.Mensaje }}
{{ formmensaje.Mensaje.errors }}
</div>
</div>
</div>
{{ formchat.non_field_errors }}
{{ formmensaje.non_field_errors }}
<button type="submit" class="btn btn-primary pull-right">Enviar</button>
</div>
</form>
谢谢!
这是追溯
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/mensajenuevo/1
Django Version: 1.6.6
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'Vitalis',
'django.contrib.admin',
'south',
'allauth',
'allauth.account',
'allauth.socialaccount',
'simplesearch')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
112. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
22. return view_func(request, *args, **kwargs)
File "/Users/eduardoalcocer/Desktop/PAGINAS WEB/MobileHealth/allauth/account/decorators.py" in _wrapped_view
33. return view_func(request, *args, **kwargs)
File "/Users/eduardoalcocer/Desktop/PAGINAS WEB/MobileHealth/Vitalis/views.py" in mensajenuevo
401. mensaje = formmensaje.save(commit=False)
File "/Library/Python/2.7/site-packages/django/forms/models.py" in save
446. construct=False)
File "/Library/Python/2.7/site-packages/django/forms/models.py" in save_instance
80. " validate." % (opts.object_name, fail_message))
Exception Type: ValueError at /mensajenuevo/1
Exception Value: The Mensajes could not be created because the data didn't validate.
答案 0 :(得分:2)
您没有以正确的方式使用formset。 formset用于处理相同表单类的多个实例,而不是2个不同的表单类。请(重新?)在此处阅读formset_factory
的文档:https://docs.djangoproject.com/en/dev/ref/forms/formsets/#django.forms.formsets.formset_factory - 第二个参数应该是FormSet
类,而不是Form
类。