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

时间:2014-07-22 01:52:04

标签: django python-2.7 django-forms

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

根据我的理解,django中的Forms是预先定义的,我无法想到一种方法可以实现这一点。

我能想出的是定义一个普通的表单类

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,但这里没有一个解决方案正确解释了如何做到这一点。另外,由于某些要求,我没有使用这些模型。所以我的数据库与模型完全无关。

我完全失去了请帮帮我

2 个答案:

答案 0 :(得分:0)

如果您有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查询取决于您的数据库引擎和表架构。

答案 1 :(得分:0)

   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广告。