【问题标题】:django UpdateView widget_tweaks 'str' object has no attribute 'as_widget'django UpdateView widget_tweaks 'str' 对象没有属性 'as_widget'
【发布时间】:2018-11-03 11:08:30
【问题描述】:

我是 django 的新手,正在开发一个小应用程序,我必须在其中更新项目模型。我正在使用 django 内置的 UpdateView 来更新已保存项目的详细信息。我还使用 widget_tweaks 来呈现带有自定义引导类的字段以进行样式设置。当我运行此代码时,它显示 str object has no attribute 'as_widget 错误。我认为表单字段将作为字符串而不是作为对象进入模板,并且 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>

以下是我用来编辑项目的编辑模板。

{% 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>

这里是模型表单

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()}

【问题讨论】:

    标签: python django


    【解决方案1】:

    您应该在UpdateView 中定义form_class = ProjectForm,其中ProjectForm 应该在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')
    

    【讨论】:

    • 我只想更新项目模型的某些字段,这就是为什么我使用字段 = ('hubstaffName','endDate', 'hoursToWork'。我也尝试使用 form_class=ProjectForm 但它确实做到了' nt 工作。此外,我的 ProjectForm 已经在 forms.py 我已经用代码更新了问题
    • 但是您的表单不在您的模板中,除非您在视图中定义了 form_class。您对 ProjectForm 的定义没有任何问题。
    • 我已经在我的视图中定义了 form_class=Project,但这也不起作用
    • 仅在模板中使用 {% render_field form.startDate %} 不起作用?考虑到您的代码,我相信这应该可以工作
    • 现在当我只使用 form.startDate 时,它​​说 'datetime.date' 对象没有属性 'as_widget'
    猜你喜欢
    • 2017-10-09
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多