使用数据库结果更新 django 选择字段

Posted

技术标签:

【中文标题】使用数据库结果更新 django 选择字段【英文标题】:update django choice field with database results 【发布时间】:2014-09-12 16:50:06 【问题描述】:

我正在使用 django 开发一个应用程序,当用户与之交互时需要更新 UI。例如,我有一个下拉字段,用户在其中选择一种饮料并提交它,然后基于该下拉菜单包含有可用饮料的地方,需要显示每个地方的价格和数量。然后,用户将进一步提交表单以进行第二个流程。

据我了解,django 中的表单是预定义的,我想不出一种方法来实现这一点。

我能想到的是定义一个常规表单类

class dform(forms.Form):
    SOURCES_CHOICES = (
              (A, 'A'),
              (E, 'E'),
              )
  drink = forms.ChoiceField(choices = SOURCES_CHOICES)
  location = forms.ChoiceField(choices = **GET THIS FROM DATABASE**)
  quantity = forms.ChoiceField(choices = **GET THIS FROM DATABASE**)
  .
  .
  .

我的看法是,

def getdrink():
   if request.method == 'POST':
      #code for handling form
      drink =  dform.cleaned_data['drink']
      #code to get values from database

我不知道如何生成或填充或附加从数据库中获取的值到表单中的选择字段。我确实尝试过查找 SO,但这里的解决方案都没有正确解释如何做到这一点。此外,由于某些要求,我没有使用这些模型。所以我的数据库与模型完全无关。

我很茫然,请帮帮我

【问题讨论】:

【参考方案1】:
   class MyForm(forms.Form):
          my_choice_field = forms.ChoiceField(choices=MY_CHOICES) 

因此,如果您希望值是动态的(或依赖于某些逻辑),您只需将代码修改为如下所示:

任一

  def get_my_choices():
   # you place some logic here 
     return choices_list
  class MyForm(forms.Form): 
     my_choice_field = forms.ChoiceField(choices=get_my_choices()) 

   User_list = [ #place logic here]
     class MyForm(forms.Form): 
     my_choice_field = forms.ChoiceField(choices=get_my_choices()) 

但是一旦数据库值被更新,新的数据值只会在服务器重启时被填充。 所以在表单中写一个这样的函数:

   class MyForm(forms.Form):
         def __init__(self, *args, **kwargs):
                super(MyForm, self).__init__(*args, **kwargs)     
                self.fields['my_choice_field'] = forms.ChoiceField( choices=get_my_choices() )

或者代替 get_my_choices,您也​​可以添加 USER_LIST。

【讨论】:

【参考方案2】:

如果您有locationquantity 的模型,ModelChoiceField 应该可以工作:

class dform(forms.Form):
    location = forms.ModelChoiceField(queryset = Location.objects.all())

否则,您需要直接查询数据库,例如:

class dform(forms.Form):
    location = forms.ChoiceField(choices = get_location_choices())

# elsewhere
from django.db import connection
def get_location_choices():
    cursor = connection.cursor()
    cursor.execute("select location_id, name from location_table")
    return cursor.fetchall()

此处使用的 SQL 查询取决于您的数据库引擎和表架构。

【讨论】:

【参考方案3】:

我认为,根据我对您问题的理解,最好的解决方案是在您的表单中包含 JSON 对象并使用 jQuery 加载这些对象,而不是一遍又一遍地提交表单。包含在您的表单中,您应该添加如下内容:

class MyForm(forms.Form):
    CHOICE_DICT = 
        'choice_1': [
            'option_1',
            'option_2',
        ],
        etc...

然后你应该在你的上下文中包含 form.CHOICE_DICT,用 jQuery 加载它,并根据对其他字段的更改来呈现它。

【讨论】:

以上是关于使用数据库结果更新 django 选择字段的主要内容,如果未能解决你的问题,请参考以下文章

Django 表单:查询结果定义的字段,单个视图同时更新多个对象

请问django如何将字符型字段按数值型排序,如‘12,123,1111,133’,排序后结果为12,123,133,1111,在线等

models.py中增加了字段,django中怎样更新

使用 Django (modify_personal_info) 更新具有特定表单字段的数据库实例

如何使用 AJAX 和 Django 从 SQL 数据库更新网站上的字段数据

Django:仅更新UpdateView中已更改的字段