首页 > 解决方案 > Django 获取对象的实例并将其传递给表单

问题描述

我是 Django 和一般编程的新手。我正在尝试从数据库生成记录列表,但有两个可以编辑的字段。在浏览器中,它应该显示一行包含以下字段:clientcode、clientname、Reason、comment Name 和 description 来自模型并且是参考。用户应该只能捕获原因和评论

我创建了一个 forms.py 文件和一个 ModelForm。我的问题是如何通过单个对象。对于此示例,我将数据集限制为 10 条记录 在我的视图文件中

def home(request):
    if request.method == 'GET':
        nca = NcaRe.objects.all()[:10]
        form = NcaReForm(instance= <what should go in here> )
        return render(request, 'NCAComments/home.html', {'form': form, 'nca': nca})
    else:
        pass

在我的模型中,我有一个名为 primarykey 的字段。我不确定如何将其传递给表格,以便我只带入该记录。我曾尝试查看文档,但无法遵循它。

我的模型 py。

from django.db import models


class NcaRe(models.Model):
    primarykey = models.IntegerField(blank=True, null=False, primary_key=True)
    clientcode = models.CharField(db_column='ClientCode', max_length=200, blank=True, null=True) 
    clientname = models.CharField(db_column='ClientName', max_length=510, blank=True, null=True)
    reason = models.TextField(blank=True, null=True)
    comment = models.TextField(blank=True, null=True)  
    class Meta:
        db_table = 'NCA_RE'

表格.py

from django.forms import ModelForm
from .models import NcaRe

class NcaReForm(ModelForm):
    class Meta:
        model = NcaRe
        fields = ['reason', 'comment']

在 html 中,我试图循环并传递表单

{% for n in nca %}
<p> {{n.clientcode}}</p>
<form>
    {% csrf_token %}
    {{ form }}
</form>
{% endfor %}

标签: django

解决方案


一般来说,如果请求的方法GET像 as ,则只需要返回空表单form()。我在下面写了示例代码,您可以在表单验证后进行计算form.is_valid()

视图.py

from django.shortcuts import render
from testPhilip.forms import NcaReForm
from testPhilip.models import NcaRe


def home(request):
    if request.method == 'GET':
        nca = NcaRe.objects.all()[:10]
        form = NcaReForm()

    elif request.method == 'POST':
        form = NcaReForm(request.POST)
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # ...
            # redirect to a new URL:

    return render(request, 'testPhilip/home.html', {'form': form, 'nca': nca})

您可以在表单验证后以如下清洁格式检索数据: comment = form.cleaned_data['comment']

更新:

如果您想使用数据库中的值或任何默认值填充表单字段,您可以将它们传递到“GET”部分,如下所示:

nca_object=NcaRe.objects.get(pk=nca_id)
form=NcaReForm({
    'comment':nca_object.comment,
    'reason':nca_object.reason,
})

有关编写表单的更多信息,请参阅Django forms doc


推荐阅读