Django:将URL请求参数保存到表单中

时间:2017-01-05 06:31:39

标签: python django

我使用表单将数据保存到其中。

models.py

class presciptiontemplates(models.Model):
    templateid = models.AutoField(primary_key=True)
    template = tinymce_models.HTMLField()
    draft = models.BooleanField(default=False)
    savedate = models.DateTimeField(default=datetime.now())
    patientid = models.ForeignKey('Patient')

我从URL传递参数Patient Id。

url(r'^addprescription/(?P<patid>\d+)/$', views.viewtemplate

如何将此参数保存到表单

views.py

def viewtemplate(request, patid):
    userid = patid
    form = templateform(request.POST)
    if request.method == "POST":
        if form.is_valid():
            presciptiontemplates.patientid = userid
            form.save()
        return redirect('index')
    else:
        form = templateform()
    return render(request, 'presapp/prescription.html', {'form': form})

forms.py

class templateform(forms.ModelForm):
class Meta:
    model = presciptiontemplates
    fields = ['template', 'draft']
    widgets = {
    'template': TinyMCE(),
    'draft': forms.CheckboxInput()
    }
    labels = {
        "patientid": _("Patient ID"),
        }
    def __init__(self, *args, **kwargs):
        super(ThatForm, self).__init__(*args, **kwargs)
        self.fields['template'].required = True

这给了我一个错误

  

[Microsoft] [SQL Server Native Client 11.0] [SQL Server]无法插入   值为NULL&#39; patientid&#39;

Django  1.10.4
Python  3.5.2
Windows 7 

3 个答案:

答案 0 :(得分:2)

假设templateform是模型表单。

您可以在save方法中使用commit=False参数,然后使用所需参数再次保存对象。

根据您的代码更改的简短代码段

...
if request.method == "POST":
    if form.is_valid():
        obj = form.save(commit=False)
        obj.patientid = userid
        obj.save()
    return redirect('index')
else:
...

答案 1 :(得分:2)

问题出在这一行:

presciptiontemplates.patientid = userid

在您的模型中, patientid 患者模型的外键,因此它需要患者模型对象,而不是患者的身份 patid 即可。 首先获取Patient对象,然后将其分配给patientid,如下所示:

def viewtemplate(request, patid):

    patient = Patient.object.get(id=patid)

    form = templateform(request.POST)
    if request.method == "POST":
        if form.is_valid():
            form = form.save(commit=False)
            form.patientid = patient
            form.save()
        return redirect('index')
    else:
        form = templateform()
    return render(request, 'presapp/prescription.html', {'form': form})

答案 2 :(得分:0)

要将userid值添加到新对象中,可以使用ModelForm。

只需将模板形式从ModelForm继承而不是Form类。

class templateform(forms.ModelForm):
    class Meta:
        model = presciptiontemplates

现在您可以执行以下操作:

form = templateform(request.POST or None, request.FILES or None)
if form.is_valid():
    instance = form.save(commit=False)
    instance.patientid = userid
    instance.save()