【问题标题】:Simple HTML forms Vs Django forms in django (Select in django forms not updating on refresh)django 中的简单 HTML 表单与 Django 表单(在 django 表单中选择不会在刷新时更新)
【发布时间】:2019-08-26 06:39:28
【问题描述】:

我有一个培训师的下拉列表。我正在使用这个获取 html 表单。

class AssignTrainerForm(forms.Form):
    TRAINER = []
    for use in User.objects.filter(Q(role='trainer') & Q(is_active=True)):
        opt = use.username + ' (' + use.first_name + ' ' + use.last_name + ')'
        TRAINER.append((opt, opt))
    trainer = forms.CharField(widget=forms.Select(choices=TRAINER, attrs={'class': 'form-control'}))

问题是我还有删除教练或添加教练的功能。如果我删除或添加培训师,刷新页面时下拉菜单不会更新。我必须重新启动服务器。

但如果我在 html 模板中使用简单的 HTML 代码(无 django 表单),例如:

<select class="form-control" name="trainer">
      {% for trainer in trainers %}
      <option>{{ trainer.username }} ({{ trainer.first_name }}
       {{ trainer.last_name }})</option>
       {% endfor %}
  </select>

这给出了预期的结果,因为刷新列表来自数据库。

反正我每次刷新页面时都会使用 django 表单并获取刷新数据,

【问题讨论】:

  • 如果您将更新提交到您的数据库,那么刷新时您的更改应该会显示出来。
  • 我已经检查过了。添加/删除工作正常并相应地更新数据库。但形式没有改变。当我在特定视图函数之外写一些东西时,也会发生同样的事情。

标签: django django-forms


【解决方案1】:

您在首次加载 AssignTrainerForm 类时定义和执行 User/TRAINER 查询(在 Django 应用程序启动时)。因为是类属性,所以只在第一次解析类的时候执行一次,直到再次启动python进程才会更新

您可以只使用ModelChoiceField,传递用户的查询集,一切都会为您处理。包括在进行更改时更新选择

trainer = forms.ModelChoiceField(
    User.objects.filter(Q(role='trainer') & Q(is_active=True)),
    widget=forms.Select(attrs={'class': 'form-control'})
)

编辑:

要更改 ModelChoiceField 中每个实例使用的标签,您可以定义自己的字段并覆盖 label_from_instance 方法

from django.forms import ModelChoiceField

class UserChoiceField(ModelChoiceField):
    def label_from_instance(self, user):
        return f'{user.first_name} {user.last_name}'

class MyForm(forms.Form):
    trainer = UserChoiceField(
        User.objects.filter(Q(role='trainer') & Q(is_active=True)),
        widget=forms.Select(attrs={'class': 'form-control'})
    )

【讨论】:

  • 在选项中它显示为对象 (1),我想要对象的名称。我已经尝试过 (queryset=..., to_field_name="name") 但它只是更改值而不是下拉选项。
  • 默认情况下,ModelChoiceFields 将使用模型/对象__str__ 方法,对于用户模型应该是用户名
猜你喜欢
  • 1970-01-01
  • 2016-12-30
  • 2012-10-29
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 2016-01-11
  • 2011-10-03
  • 1970-01-01
相关资源
最近更新 更多