【问题标题】:newbie Django Choicefield/Charfield display on html page新手 Django Choicefield/Charfield 在 html 页面上显示
【发布时间】:2013-04-30 15:09:28
【问题描述】:

我一直在阅读 django 书籍和 django 文档,但仍然可以弄清楚。

我有这个model.py

from django.db import models
from django.forms import ModelForm

class Zonas(models.Model):
    name = models.CharField(max_length=30)
    def __unicode__(self):
        return self.name

class ZonasForm(ModelForm):
    class Meta:
        model = Zonas

这个view.py:

from django    import forms
from testApp.models import Zonas
from django.shortcuts import render_to_response

def menuForm (request):
    z = list (Zonas.objects.all())
    numbers = forms.CharField(max_length=30,
            widget=forms.Select(choices=z))

    return render_to_response('hello.html', {'numbers':numbers})

这个html:

<html>
<body>

<form action="" method="get">
    <div class="field">

{{ form.numbers }}

</div>
<input type="submit" value="Submit">
</form>
</body>
</html>

回答这个urls.py:

from django.conf.urls import patterns, include, url
from testApp.views import menuForm

urlpatterns = patterns('',

   url(r'^hello/$',  menuForm ),
)

当我运行服务器时,我得到的只是一个只有提交按钮的页面,并且没有 form.number 应该是一个选择菜单。 我试过这个views.py

def menuForm (request):
    z = list (Zonas.objects.all())
    numbers = forms.ChoiceField(choices=z)
    return render_to_response('hello.html', {'numbers':numbers})

但结果是一样的……

有什么提示吗?我应该使用不同的回报吗?

【问题讨论】:

    标签: python html django forms return


    【解决方案1】:

    当您从未将form 变量传递给模板时,您正在尝试访问{{ form.numbers }}。您需要使用{{ numbers }} 直接访问numbers

    你也没有完全正确地使用表格。看看这个https://docs.djangoproject.com/en/dev/topics/forms/

    创建一个包含ModelChoiceField的菜单表单

    forms.py

    class MenuForm(Form):
        zonas = forms.ModelChoiceField(queryset=Zonas.objects.all())
    

    现在use that form in your view

    views.py

    from myapp.forms import MenuForm
    
    def menuForm(request):
        if request.method == 'POST': # If the form has been submitted...
            form = MenuForm(request.POST) # A form bound to the POST data
            if form.is_valid(): # All validation rules pass
                # Process the data in form.cleaned_data
                # ...
                return HttpResponseRedirect('/success/') # Redirect after POST
    
        else:
            form = MenuForm() # An unbound form
    
        return render(request, 'hello.html', {
            'form': form,
        })
    

    现在你可以use the form in your template

    你好.html

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

    【讨论】:

      【解决方案2】:

      使用ModelChoiceField怎么样?这段代码对我有用。

      views.py:

      from django import forms
      from models import Zonas
      from django.shortcuts import render_to_response
      
      
      class NumbersForm(forms.Form):
          numbers = forms.ModelChoiceField(queryset=Zonas.objects.all())
      
      
      def menuForm(request):
          form = NumbersForm()
          return render_to_response('hello.html', {'form': form})
      

      你好.html:

      <form action="" method="get">
          <div class="field">
      
              {{ form.as_p }}
      
          </div>
          <input type="submit" value="Submit">
      </form>
      </body>
      </html>
      

      【讨论】:

      • as_p 重定向到 numbersform()?
      • 它是为在模板中显示表单而设计的,请参阅docs.djangoproject.com/en/dev/topics/forms/…。希望对您有所帮助。
      • as_p 方法返回在 html 中呈现表单所需的字符串。
      【解决方案3】:

      您的应用程序中有几个错误。让我们执行以下操作:

      您的testApp 文件夹中需要以下文件:models.pyviews.pyforms.py。现在,在models.py 中,您将定义模型Zonas(几乎和您所做的一样)

      #models.py
      from django.db import models
      
      class Zonas(models.Model):
          name = models.CharField(max_length=30)
          def __unicode__(self):
              return self.name
      

      现在,在forms.py 文件中,您将拥有以下内容:

      from testApp.models import Zonas
      from django.forms import ModelForm
      
      z = ((zona.name,zona.name) for zona in Zonas.objects.all())
      
      class ZonasForm(ModelForm):
          name = forms.CharField(max_length=30,widget=forms.Select(choices=z))
          class Meta:
              model = Zonas
      

      那么,你的views.py

      from testApp.forms import ZonasForm
      from django.shortcuts import render_to_response
      
      def menuForm (request):
          if request.method = 'POST':
              form = ZonasForm(request.POST)
              if form.is_valid():
                  form.save()
          else:
              form = ZonasForm()
          return render_to_response('hello.html', {'form':form})
      

      你的表单和所有东西都处理好了。

      接下来,你的hello.html

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

      所有这些结合起来应该可以工作。您的应用定义中有一些概念错误,我希望这可以作为指导。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-06
        • 2015-11-30
        • 2019-07-26
        • 2019-11-06
        • 2019-02-21
        • 1970-01-01
        • 2015-04-23
        • 2019-10-01
        相关资源
        最近更新 更多