python - 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 并以这种方式更新小部件,但我的实现不起作用,所以我问如何正确地做到这一点。
解决方案
推荐阅读
- python - 如何在 tkinter 画布上放置动画?
- reactjs - 如何在页面重新加载后使计数器按钮保持不变
- c# - 使用linq mvc c#从数据库中检索图像
- python - Jupyter Notebook:使用 %run 执行另一个 Notebook 时抑制输出?
- javascript - Firefox 和 Safari 浏览器的 Cookie 存储替代品
- groovy - 为什么metaClass.hasProperty实际上需要两个参数时允许一个参数
- javascript - 我如何以访客身份加入 Webex 会议?
- amazon-web-services - 在 AWS 中创建 IAM 策略以保护看到所有 EC2 实例
- python - 在更长的字符串中,如何在 PostgreSQL(和/或 Python 3)中将一个字符(例如,'a')和一个变音字符(例如,'U+030A')转换为单个字符('å')
- excel - 当路径和名称在工作表单元格中时,VBA迭代打开文件?