首页 > 解决方案 > Django 将模型实例数据添加到 forms.py 中的小部件

问题描述

表格.py

from django.forms import *
from .models import client, notes, contractor, cNotes, personnel, pNotes, estimate, job

class clientForm(self, ModelForm):
    class Meta():
        model = client
        fields = ("contractor", "firstName", "lastName", "phoneNumber", "email", "gateCode")
        #inst = client.objects.get(pk=pk)
        widgets = {
          'firstName': TextInput(attrs={'value' : self.instance.firstName}), 'lastName': TextInput(attrs={'value' : self.instance.lastName})
      }

self.instance.firstName需要在模型中获取该实例的当前名字,以便打开编辑表单视图时小部件的值是当前值(注意:设置initial=不适用于我想要的)。我已经尝试了很多解决方案,但我似乎无法让它们中的任何一个起作用。

编辑:我尝试覆盖 init

def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['firstName'].widget.attrs.update(
            {'value': self.instance.firstName},
        )

但是当我这样做时,它说 self 没有定义。

编辑:我还尝试通过在视图中获取实例数据并通过覆盖将其传递给表单来传递实例数据get_form_kwargs

模型.py

class client(models.Model):
    #model representing client
    contractor = models.ForeignKey('contractor', on_delete=models.CASCADE, blank=True, null=True)
    firstName = models.CharField(max_length=50, help_text='Enter first name of client', null=True, blank=True)
    lastName = models.CharField(max_length=50, help_text='Enter last name of client', null=True, blank=True)
    phoneNumber = models.CharField(max_length=16, help_text='Enter number for client', null=True, blank=True)
    email = models.EmailField(max_length=50, help_text='Enter email for client', blank=True, null=True)
    gateCode = models.CharField(max_length=50, help_text='Enter gate code for client', blank=True, null=True)
    fullName = models.CharField(max_length=50, help_text='', blank=True, null=True)
    client_id = models.SlugField(max_length=50, help_text='', primary_key=True)
    initialContactDate = models.DateTimeField(auto_now_add=True, blank=True, null=True)

视图.py

def eClientF(request, pk=None):
    inst = client.objects.get(pk=pk)
    if request.method == "POST":
        client_form = clientForm(request.POST, instance=inst)
        estimate_form = estimateForm(request.POST, instance=inst)
        notes_form = notesForm(request.POST, instance=inst)
        if(client_form.is_valid() and estimate_form.is_valid() and notes_form.is_valid()):
            cli = client_form.save()
            estimate2 = estimate_form.save(False)
            notes2 = notes_form.save(False)
            estimate2.client = cli
            notes2.client = cli
            estimate2.save()
            notes2.save()
            return redirect('/main/client')
    else:
        client_form = clientForm(instance=inst)
        estimate_form = estimateForm(instance=inst)
        notes_form = notesForm(instance=inst)
    args = {}
    args["client_form"] = client_form
    args["estimate_form"] = estimate_form
    args["notes_form"] = notes_form
    return render(request, "main/eClformTemp.html", args)

models.py 和 views.py 已简化为仅相关代码

编辑:我已按照建议修改了views.py,但是当我尝试使用此表单时,它不会加载页面并说 self 无法识别引用 froms.py 的位置TextInput(attrs={'value' : self.instance.firstName})

编辑:它不会,我知道当你在它应该填充的视图中创建表单时过去的实例,但它没有。我参考了文档和许多示例来确认我做的正确,但它没有工作。为了解决这个问题,我运行了服务器并打开了表单,然后我检查了元素并复制了 html 并手动将值添加到 html 并使用我复制的内容作为模板来确保此解决方法有效。但是,不能手动制作模板,因为它不能正确反映数据库中的更改。我只需要知道如何将当前模型实例传递到小部件属性中以获得值。我将不得不编辑 init 并以这种方式更新小部件,但我的实现不起作用,所以我问如何正确地做到这一点。

标签: pythondjango-modelsdjango-viewsdjango-formsinstance

解决方案


推荐阅读