值错误 - 无法创建,因为数据未验证

时间:2014-11-07 17:57:01

标签: python django django-models django-forms django-views

我正在尝试使用同一页面保存两个表单,为此我创建了一个表单集。我以前和森林一起工作过,但这次我一直收到一个错误,告诉我表单数据没有验证,我似乎无法找到问题。

这是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.

1 个答案:

答案 0 :(得分:2)

您没有以正确的方式使用formset。 formset用于处理相同表单类的多个实例,而不是2个不同的表单类。请(重新?)在此处阅读formset_factory的文档:https://docs.djangoproject.com/en/dev/ref/forms/formsets/#django.forms.formsets.formset_factory - 第二个参数应该是FormSet类,而不是Form类。