【问题标题】:HTML tags for choicefield in DjangoDjango中选择字段的HTML标签
【发布时间】:2014-01-19 11:00:28
【问题描述】:

我似乎无法在任何地方找到关于如何在 Django 中执行选择域 HTML 标记的信息。我找到了单选按钮和其他高级选择字段,但在 Django 的基本下拉 HTML 标记中什么也没有。我有models.pyview.py 设置将list1 传递给html 页面,但似乎不能让它显示除了

<select style="width:300px">
  {% for choice in list1.VIEWS %}
  <option>{{choice}}</option>
  {{choice}}
  {% endfor %}
</select>

非常感谢您的帮助

models.py

class preset_list(models.Model):
    VIEWS = (
        ('1', 'X'),
        ('2', 'Y'),
    )
    query_choice = forms.ChoiceField(choices=VIEWS)

view.py

list1 = models.preset_list()
return render_to_response('services.html', 
         {'array':json.dumps(data, cls=SpecialEncoder),
         'list1':list1},
                          )

【问题讨论】:

  • 不确定你在问什么。你说你“似乎不能让它显示任何东西”但是你显示了一些模板代码。当然那不是 django 输出?你在用表格吗?请显示模型、视图、表单(如果适用)和模板,然后显示 django 正在生成的内容(可能是直接的 html),然后显示您希望它生成的内容。然后有人可以提供帮助。
  • 我用 python 代码更新了,我正在寻找简单的下拉菜单,来选择和取回一些数据。
  • 当你说你“找不到任何地方”时,你有没有想过看看forms documentation
  • @DanielRoseman 是的,它没有 HTML 代码!

标签: python html django


【解决方案1】:

我们可以在不使用 django 表单的情况下使用它

<select style="width:300px" name="presen">
  {% for val, name in preset_list.VIEWS %}
  <option value="{{val}}">{{name}}</option>
  {% endfor %}
</select>

【讨论】:

    【解决方案2】:

    您可以创建一个带有下拉菜单的表单,并告诉它使用哪些值来填充它,如下所示:

    表格

    class MyDropDownForm(forms.ModelForm):
        somerow = forms.ModelChoiceField(
            # change this queryset if you want to limit the options
            queryset= MyModel.objects.all().values('somerow'),
            widget=Select(),
            required=True,
        )        
    
        class Meta:
            model = MyModel
            fields = ['somerow']
    

    查看

    class MyView(DjangoTemplateView):
    
        def get(self, request):
            # you can set an instance when creating the form to set the value
            # to be that of an existing row in your model
            # MyDropDownForm(instance=MyModel.objects.filter(id=1))
            form = MyDropDownForm()
            return render_to_response('app/page.html', {'form': form})
    
        def post(self, request):
            # if you had set the instance in the get you want to do that again
            form = MyDropDownForm(data=request.POST)
            if form.is_valid():
                return render_to_response('app/success.html')
            return render_to_response('app/page.html', {'form': form})
    

    Page.html

    <form method="post">
        {% csrf_token %}
        {{ form.id  }}
        {{ form.myrow }}
        {% if form.myrow.errors %}
            {% for error in form.myrow.errors %}<p>{{ error }}</p>{% endfor %}
        {% endif %}
        <button>Submit</button>
    </form>
    

    Take a look at the docs here for more info on creating model forms.

    【讨论】:

      【解决方案3】:

      试试通用的CreateView

      views.py

      from django.views.generic.edit import CreateView
      from .models import PresetList
      
      class PresetListCreate(CreateView):
          model = PresetList
      

      presetlist_form.html

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

      【讨论】:

        【解决方案4】:

        ModelForms 是你的朋友。

        models.py

        class PresetList(models.Model):
            VIEWS = (
                ('1', 'X'),
                ('2', 'Y'),
            )
            query_choice = forms.ChoiceField(choices=VIEWS)
        

        forms.py

        from django.forms import ModelForm
        from . import models
        
        class PresetListForm(ModelForm):
            class Meta:
                model = models.PresetList
        

        view.py

        from . import forms
        
        def my_view(request):
        
            preset_form = forms.PresetListForm()
        
            return render_to_response('services.html', {
                'array': json.dumps(data, cls=SpecialEncoder),
                'preset_form': preset_form,
            })
        

        services.html

        <form method=POST action="/somewhere">
            {{ preset_form.as_p }}
        </form>
        

        【讨论】:

        • 你可以用{{ preset_form }}试试吗?
        • 通常,如果您在模板中没有得到任何结果,您要么没有将数据放入上下文中,要么没有在模板中使用相同的名称。您能否仔细检查正确的值是否进入上下文?否则,dpaste你当前的代码,我会尝试调试。
        • 我可以验证所有的名称是否正确,我从forms.pyhtml 的所有文件中追溯了名称,但什么也没有。我可以通过.VIEWS 执行我在原始问题中发布的操作来调用preset_form 这是链接dpaste.de/D1DX 非常感谢!
        • 您的 dpaste 存在几个问题:1) {% csrf_token %} 不在
          ...
          标记中。 2) csrf_token 仅在用户通过身份验证时输出。 3)你的标题“HTML” - 你的意思是说“模板”吗?我假设这是您视图中命名的模板。 4) 模板缺少“{% extends %}”的东西。此外,当您说“没有出现”时,请查看浏览器的开发人员视图并向我们展示出现了什么。至少有一个 吗?
        • 我不明白再说一遍如何传达更多含义。 ;-) 这就是我将您的“检查预设表单以获取选项...”转换为 Python 代码的方式。 检查选项似乎有点重载了不同的含义,尤其是在 SelectBoxes 的上下文中...只是试图戳穿自然语言的歧义和术语的不匹配含义。
        【解决方案5】:

        不确定你想做什么,但如果你想在显示 X 时发送 1,那么以下应该可以工作:

        <select style="width:300px">
          {% for choice in list1.VIEWS %}
          <option value={{choice.0}}>{{choice.1}}</option>
          {{choice}}
          {% endfor %}
        </select>
        

        【讨论】:

        • 创建下拉列表,但不填充它
        猜你喜欢
        • 2012-08-12
        • 2023-02-22
        • 2018-12-12
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多