Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django ModelForm中的Queryset最初会受到适当的限制,但在表单提交时会出现错误_Django_Django Forms_Django 1.3 - Fatal编程技术网

Django ModelForm中的Queryset最初会受到适当的限制,但在表单提交时会出现错误

Django ModelForm中的Queryset最初会受到适当的限制,但在表单提交时会出现错误,django,django-forms,django-1.3,Django,Django Forms,Django 1.3,我想根据发送请求的用户限制表单的查询集。当表单提交但无效时,我在获取模型表单以正确限制字段的查询集时遇到了一些问题。表单会重新显示错误文本,但queryset不再受限制。这里的原因是什么 型号.py from django.db import models from django.contrib.auth.models import User class Patient(models.Model): name = models.CharField(max_length=100)

我想根据发送请求的用户限制表单的查询集。当表单提交但无效时,我在获取模型表单以正确限制字段的查询集时遇到了一些问题。表单会重新显示错误文本,但queryset不再受限制。这里的原因是什么

型号.py

from django.db import models
from django.contrib.auth.models import User

class Patient(models.Model):
    name = models.CharField(max_length=100)
    doctor = models.ForeignKey(User)
    def __unicode__(self):
        return self.name

class Prescription(models.Model):
    name = models.CharField(max_length=100)
    patient = models.ForeignKey(Patient)
import medical.models as models
import medical.forms as forms
from django.shortcuts import render

def add_form(request):
    if request.method == 'POST':
        form = forms.PrescriptionForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = forms.make_prescription_form(request.user)
    return render(request, 'add_form.html', {'form': form})
import medical.models as models
from django.forms import ModelForm, ModelChoiceField

class PrescriptionForm(ModelForm):
    class Meta:
        model = models.Prescription

def make_prescription_form(dr):
    class PrescriptionForm(ModelForm):
        patient = ModelChoiceField(queryset=models.Patient.objects.filter(doctor=dr))
        class Meta:
            model = models.Prescription
    return PrescriptionForm
视图.py

from django.db import models
from django.contrib.auth.models import User

class Patient(models.Model):
    name = models.CharField(max_length=100)
    doctor = models.ForeignKey(User)
    def __unicode__(self):
        return self.name

class Prescription(models.Model):
    name = models.CharField(max_length=100)
    patient = models.ForeignKey(Patient)
import medical.models as models
import medical.forms as forms
from django.shortcuts import render

def add_form(request):
    if request.method == 'POST':
        form = forms.PrescriptionForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = forms.make_prescription_form(request.user)
    return render(request, 'add_form.html', {'form': form})
import medical.models as models
from django.forms import ModelForm, ModelChoiceField

class PrescriptionForm(ModelForm):
    class Meta:
        model = models.Prescription

def make_prescription_form(dr):
    class PrescriptionForm(ModelForm):
        patient = ModelChoiceField(queryset=models.Patient.objects.filter(doctor=dr))
        class Meta:
            model = models.Prescription
    return PrescriptionForm
forms.py

from django.db import models
from django.contrib.auth.models import User

class Patient(models.Model):
    name = models.CharField(max_length=100)
    doctor = models.ForeignKey(User)
    def __unicode__(self):
        return self.name

class Prescription(models.Model):
    name = models.CharField(max_length=100)
    patient = models.ForeignKey(Patient)
import medical.models as models
import medical.forms as forms
from django.shortcuts import render

def add_form(request):
    if request.method == 'POST':
        form = forms.PrescriptionForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = forms.make_prescription_form(request.user)
    return render(request, 'add_form.html', {'form': form})
import medical.models as models
from django.forms import ModelForm, ModelChoiceField

class PrescriptionForm(ModelForm):
    class Meta:
        model = models.Prescription

def make_prescription_form(dr):
    class PrescriptionForm(ModelForm):
        patient = ModelChoiceField(queryset=models.Patient.objects.filter(doctor=dr))
        class Meta:
            model = models.Prescription
    return PrescriptionForm
添加表单.html

{{ request.user.first_name }}
{% if form.errors %}
<p style="color: red;">Please correct the error{{ form.errors|pluralize }} below.</p>
{% endif %}

<form action="" method="post">{% csrf_token %}
     {{ form }}
     <br>
     <input type="submit" value="Submit">
</form>
{{request.user.first_name}
{%if form.errors%}
请更正下面的错误{{form.errors | pluralize}}

{%endif%} {%csrf_令牌%} {{form}}

我将非常感谢任何与此相关的帮助,或关于实现相同目标的更好方法的建议!让我知道如果有更多的文件会有帮助。我使用的是Django 1.3。

首先,看起来您省略了一点-
make\u prescription\u form
返回一个类,而不是表单实例,并且您将该类直接传递给GET路径中的呈现。我想那是个打字错误

您没有在POST路径中使用
make\u prescription\u表单
wrapper。此实施的最小变化是:

def add_form(request):
    form_class = forms.make_prescription_form(request.user)
    if request.method == 'POST':
        form = form_class(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = form_class()
    return render(request, 'add_form.html', {'form': form})
至于其他方法,您可以直接在视图中设置表单字段的queryset

forms.py
class PrescriptionForm(ModelForm):
    class Meta:
        model = models.Prescription

views.py
def add_form(request):
    if request.method == 'POST':
        form = PrescriptionForm(request.POST)
        form.fields['patient'].queryset = models.Patient.objects.filter(doctor=request.user)
        if form.is_valid():
            form.save()
    else:
        form = PrescriptionForm()
        form.fields['patient'].queryset = models.Patient.objects.filter(doctor=request.user)
    return render(request, 'add_form.html', {'form': form})
或者将
doctor
设置为处方表单的
\uuuu init\uuuu
的参数,并在此处更新查询集:

forms.py
class PrescriptionForm(ModelForm):
    class Meta:
        model = models.Prescription

    def __init__(self, *args, doctor=None, **kwargs):
        super(PrescriptionForm, self).__init__(*args, **kwargs)
        if self.doctor is not None:
            self.fields['patient'] = models.Patient.objects.filter(doctor=doctor)

views.py
def add_form(request):
    if request.method == 'POST':
        form = PrescriptionForm(request.POST, doctor=request.user)
        if form.is_valid():
            form.save()
    else:
        form = PrescriptionForm(doctor=request.user)
    return render(request, 'add_form.html', {'form': form})                

此外,我希望它返回一个表单类。我使用同一视图编辑/添加多种类型的对象。所以我有一个部分,它将适当的类加载到一个变量中,然后将该变量用于函数的其余部分。