python - django UpdateView widget_tweaks 'str' 对象没有属性 'as_widget'
问题描述
我是 django 的新手,正在开发一个小应用程序,我必须在其中更新项目模型。我正在使用 django 内置的 UpdateView 来更新已保存项目的详细信息。我还使用 widget_tweaks 来呈现带有自定义引导类的字段以进行样式设置。当我运行此代码时,它显示str 对象没有属性'as_widget错误。我认为表单字段将作为字符串而不是作为对象进入模板,并且小部件调整的 render_field 标记无法呈现它,但我不知道为什么它会作为字符串出现?我只想更新模型的某些字段。这就是我在 UpdateView 中使用“字段”的原因。但我也试过 form_class 只是为了检查,但这也没有用。我已经被这个错误困了两天了。任何帮助将不胜感激。
以下是项目模型
class Project(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=20 , unique=True)
startDate = models.DateField(default=timezone.now)
endDate = models.DateField()
sourceOfProject = models.CharField(default='Website', verbose_name='Project Source',max_length=20 , choices=(('Website' , 'Website'),('Client','Client'))) # website or client etc
sourceName = models.CharField(default='' , verbose_name='Source Name' , max_length=20)
paymentType = models.CharField(default='Fixed' , verbose_name='Payment Type', max_length=20 , choices=(('Hourly','Hourly'),('Fixed','Fixed'))) # If True then hourly else fixed
ProjectPaymentAmount = models.PositiveIntegerField(verbose_name='Amount') # this amount is according to hourlyPayment==True or False
is_Active = models.BooleanField(default=True)
projectSeverity = models.PositiveIntegerField(default=1, choices=SEVERITY_CHOICES)
hubstaffName = models.CharField(max_length=30, null=True , default='')
hoursToWork = models.PositiveIntegerField()
def __str__(self):
return "Project: {}".format(self.name)
这是视图
class ProjectUpdateView(UpdateView):
model = Project
fields = ('hubstaffName','endDate', 'hoursToWork' ,'paymentType','ProjectPaymentAmount','sourceOfProject','sourceName',)
#form_class = ProjectForm
template_name = "Administration/Manage-Projects.html"
context_object_name = 'project_form' #name of the context object in the template
pk_url_kwarg = 'pid'
以下是网址部分。
path('edit-Project/<int:pid>',ProjectUpdateView.as_view(),name='editProject')
在此按钮上单击它将此表单发布到我正在使用更新视图的“管理:编辑项目”视图。
<form action="{% url 'Administration:editProject' pid %}" method="post">
{% csrf_token %}
<button id="EditProject" type="submit" class="btn btn-primary mx-3 my-2" >Edit this Project</button>
</form>
以下是我用来编辑 Project 的编辑模板。
{% extends 'base.html' %}
{% load widget_tweaks %}
{% block content %}
<div class="container py-3">
<div class="row">
<div class="mx-auto col-sm-6">
<!-- form user info -->
<div class="card">
<div class="card-header">
<h4 class="mb-0">Add Project</h4>
</div>
<div class="card-body">
<form method="post" class="form" role="form">
{% csrf_token %}
<div class="form-group row">
<label class="col-lg-3 col-form-label form-control-label">{{ project_form.name.label }}</label>
<div class="col-lg-9">
{% render_field project_form.name class="form-control" %}
</div>
</div>
<div class="form-group row">
<label class="col-lg-3 col-form-label form-control-label">{{ project_form.startDate.label }}</label>
<div class="input-group date col-lg-9" data-provide="datepicker">
{% render_field project_form.startDate class="form-control" %}
<div class="input-group-addon">
<span class="glyphicon glyphicon-th"></span>
</div>
</div>
</div>
<div class="form-group row">
<label class="col-lg-3 col-form-label form-control-label">{{ project_form.endDate.label }}</label>
<div class="input-group date col-lg-9" data-provide="datepicker">
{% render_field project_form.endDate class="form-control" %}
<div class="input-group-addon">
<span class="glyphicon glyphicon-th"></span>
</div>
</div>
</div>
<div class="form-group row">
<label class="col-lg-3 col-form-label form-control-label">{{ project_form.sourceOfProject.label }}</label>
<div class="col-lg-9">
{% render_field project_form.sourceOfProject class="form-control" %}
</div>
</div>
<div class="form-group row">
<label class="col-lg-3 col-form-label form-control-label">{{ project_form.sourceName.label }}</label>
<div class="col-lg-9">
{% render_field project_form.sourceName class="form-control" %}
</div>
</div>
<div class="form-group row">
<label class="col-lg-3 col-form-label form-control-label">{{ project_form.paymentType.label }}</label>
<div class="col-lg-9">
{% render_field project_form.paymentType class="form-control" %}
</div>
</div>
<div class="form-group row">
<label class="col-lg-3 col-form-label form-control-label">{{ project_form.ProjectPaymentAmount.label }}</label>
<div class="col-lg-9">
{% render_field project_form.ProjectPaymentAmount class="form-control" %}
</div>
</div>
<div>
</div>
<div>
</div>
<div>
<button class="btn btn-primary" name="save_home" type="submit">Save and Return</button>
<button class="btn btn-primary" name="save_another" type="submit">Save and Add Another</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
这里是 ModelForm
class ProjectForm(forms.ModelForm):
class Meta:
model = Project
fields = ('name' , 'startDate' ,'endDate' , 'sourceOfProject','sourceName','paymentType','ProjectPaymentAmount','hoursToWork' )
widgets = {'startDate':forms.SelectDateWidget(), 'endDate':forms.SelectDateWidget(), 'sourceOfProject':forms.Select()}
解决方案
你应该form_class = ProjectForm
在你的UpdateView
, whereProjectForm
应该在forms.py
模型Project
中定义。比您在模板中呈现您的字段,如下所示。
Manage-Projects.html
{% for field in form %}
<div class="form-group">
{% render_field field class="form-control" %}
</div>
{% endfor %}
views.py
class ProjectUpdateView(UpdateView):
model = Project
form_class = ProjectForm
template_name = "Administration/Manage-Projects.html"
context_object_name = "project"
forms.py
class ProjectForm(forms.ModelForm):
class Meta:
model = Project
fields = ('name' , 'startDate' ,'endDate' , 'sourceOfProject','sourceName','paymentType','ProjectPaymentAmount','hoursToWork' )
widgets = {'startDate':forms.SelectDateWidget(), 'endDate':forms.SelectDateWidget(), 'sourceOfProject':forms.Select()}
问题也可能出在您作为表单实现的“编辑”按钮中。使用锚标记并将 project.pk 发送到 url,如下所示。
<a class="btn btn-primary" href="{% url 'Administration:editProject' project.pk %}">Edit</a>
您可以在 UpdateView 中删除 pk_url_kwargs 并更新 url。
path('edit-Project/<int:pk>',ProjectUpdateView.as_view(),name='editProject')
推荐阅读
- c# - LINQ 方法除了给我 System.ArgumentException for IQuareable
- angular - 您如何在日期输入字段的末尾放置 mat-datepicker-toggle mat-icon
- flutter - 如何给轮播图像全屏宽度?
- ios - 设置 UIPickerView 行的背景颜色
- sql - 带分区的 SQL 分组
- python - numpy 在两个 3d 矩阵上应用函数
- python - 是否可以在 Django 中制作移动应用程序?
- c# - 捆绑配置 xsd (bundleconfiguration.xsd)
- docker - 在 asp.net core docker 镜像中使用 wkhtml2pdf
- spring - 如何在 apache 中添加虚拟主机以指向部署在 Tomcat 上的 Spring REST API