【问题标题】:How get individual fields from django model?如何从 django 模型中获取各个字段?
【发布时间】:2017-05-20 00:27:20
【问题描述】:

在我的 django models.py 中:

class Agent1(models.Model):
    show_name = models.CharField(db_column='Show_Name', max_length=100,null=True)
    exhibiting_company_name = models.CharField(db_column='Exhibiting_Company_Name', max_length=100,null=True) # Field name made lowercase.
    company_website = models.CharField(db_column='Company_Website', max_length=100,null=True)  # Field name made lowercase.
    company_generic_email = models.EmailField(db_column='Company_Generic_Email', max_length=100,null=True)  # Field name made lowercase.

class Agent2(models.Model):
    show_name = models.CharField(db_column='Show_Name', max_length=100,null=True)
    exhibiting_company_name = models.CharField(db_column='Exhibiting_Company_Name', max_length=100,null=True) # Field name made lowercase.
    company_website = models.CharField(db_column='Company_Website', max_length=100,null=True)  # Field name made lowercase.
    company_generic_email = models.EmailField(db_column='Company_Generic_Email', max_length=100,null=True)  # Field name made lowercase.

像这样,我有大约 30 多个模型,这只是我有 20 多个字段的几个字段

& 在我的 new_data.html 文件中:

<form method="post"action="">{% csrf_token %}
{{ form.as_p}}
<input type="submit" name="" value="Submit">
</form>

我怎样才能只显示例如在我的 html 模板中显示名称和展览公司名称,而无需在 forms.py 中创建自定义表单?

有什么方法可以像这样在&lt;input&gt; 标记中单独调用我的模型字段:

<form action="demo_form.asp">
   Show Name: <input type="text" name="sname"><br/>
   Company Name: <input type="text" name="cname"><br/>
  <input type="submit" value="Submit">
</form> 

?

【问题讨论】:

    标签: python django python-3.x django-1.10


    【解决方案1】:

    如果您只想显示这些字段,那很容易:

    <form method="post" action="">
        {{ form.show_name }}<br/>
        {{ form.exhibiting_company_name }}<br/> 
        <input type="submit" value="Submit">
    </form> 
    

    但是除非这些是唯一的必填字段,否则您的表单将无法验证,并且您不会知道原因,因为您没有显示错误消息。

    IOW,您必须定义一个自定义表单。但实际上,使用forms.ModelForm,只需要几行代码。

    现在来点完全不同的东西:拥有两个或多个具有相同架构并命名为“Model1”、“Model2、(...)、“ModelN”的模型是一种巨大设计气味。如果它们具有相同的架构,它们是一个单一的模型(以及 db 级别的一个表)。

    【讨论】:

    • 这些表是基于用户的,它们是不同的管理页面
    • "这些表是基于用户的":它本身并不保证不同的模型 - 只需在 user 上添加一个外键(如果 "user" 是一个模型 - 否则就让它成为一个 int或具有硬编码值的 char 字段以一种或另一种方式标识“用户”)。如果“不同”是指“具有一组通用字段和方法以及额外的每个用户字段或方法”(意味着您必须为每个用户编写特定代码),那么通用部分应该存在于一个基本应用程序中(作为抽象模型或具体模型),并且每个用户的定制应该存在于每个用户的应用程序中。
    【解决方案2】:

    如果我正确理解了问题,您只需在模板中显示特定字段。为此,您可以遍历所有表单字段(请参阅docs)并仅显示具有特定名称的字段:

    <form method="post" action="">
    {% csrf_token %}
    {% for field in form %}
        {% if field.name == "show_name" or field.name == "exhibiting_company_name" %}
            {{ field }}
        {% endif %}
    {% endfor %}
    <input type="submit" value="Submit">
    </form> 
    

    【讨论】:

    • 感谢它是如此简单没想到它感谢您的帮助:)
    • 顺便说一句,这样做后它没有更新数据库中的数据,我该怎么做?
    • @pratirupmukherjee 尝试将 {{ field.errors }} 添加到模板中。这将显示发布数据期间发生的错误。
    • 这实际上是一个双重 WTF - 首先您在表单的字段上循环,您可以直接将它们作为 form.show_nameform.exhibiting_company_name 获取,然后因为如果表单有任何其他必填字段不会验证(并且您不会看到错误,因为您既没有显示缺失的字段也没有显示 form.errors
    • @bruno desthuilliers 真丢脸!我没想到:(感谢您提供正确的方法。
    猜你喜欢
    • 2015-05-31
    • 2011-02-04
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2016-08-11
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多