【问题标题】:Caught TypeError while rendering: 'BoundField' object is not iterable渲染时捕获 TypeError:“BoundField”对象不可迭代
【发布时间】:2011-05-08 17:55:48
【问题描述】:

我正在尝试将标签列表显示为 tag.name(而不是列表)。但是,当我尝试在列表上运行 for 循环时,它会抛出 "Caught TypeError while rendering: 'BoundField' object is not iterable."

  <dd>{% for tag in form.tags %}{{tag.name}}{% endfor %}</dd>

遍历 .all 将加载页面,但不显示标签字段。

  <dd>{% for tag in form.tags.all %}{{tag.name}}{% endfor %}</dd>



  class Profile(models.Model):

    user = models.ForeignKey(User)

  tagging.register(Profile)




form = ProfileForm(initial={
        "fullname":fullname,
        "location":request.user.get_profile().location,
        "website":request.user.get_profile().website,
        "twitter_account":request.user.get_profile().twitter_account,
        "email":request.user.email,
        "bio":request.user.get_profile().bio,
        "tags":request.user.get_profile().tags
    })



    class ProfileForm(forms.Form):
        fullname = forms.CharField(
             label=_("Full Name"),
             widget=forms.TextInput(),
                            required=False)

        location = forms.CharField(
             label=_("Location"),
             widget=forms.TextInput(),
                            required=False)

        website = forms.CharField(
             label=_("Website"),
             widget=forms.TextInput(),
                            required=False)

        twitter_account = forms.CharField(
             label=_("Twitter"),
             widget=forms.TextInput(),
                            required=False)

        bio = forms.CharField(
             label=_("Bio"),
             widget=forms.Textarea(),
                            required=False)

        tags = forms.CharField(
    label=_("Keywords"),
    widget=forms.Textarea(),
                            required=False)           

非常感谢!

【问题讨论】:

  • 您是否尝试过在 django shell 中加载 ProfileForm 并查看 form.tags.all() 返回的内容?
  • 我没有。我对 django shell 不是很有经验。那么从表单导入 ProfileForm ... 那么呢?
  • from forms import ProfileForm 然后form = ProfileForm(initial={blahblahblah...}) 然后form.tags.all() 看看它输出了什么
  • >>> form = ProfileForm(initial={'fullname': 'emile', 'tags': {'shoe','cheese'}}) >>> form.tags.all( )回溯(最近一次调用最后):文件“”,第 1 行,在 AttributeError:'ProfileForm' 对象没有属性'tags'
  • 最后一件我忘记了,我正在使用 Django-Tagging 应用程序:code.google.com/p/django-tagging

标签: python django django-forms django-views


【解决方案1】:

来自Howto Post的代码


模板:
{% for tag in blogpost.get_tags %}
  <a href="/blog/tag/{{tag}}" alt="{{tag}}" title="{{tag}}">{{tag}}</a>
{%endfor%}



模型:
from django.db import models
from tagging.fields import TagField
from tagging.models import Tag

class BlogPost(models.Model):

    title = models.CharField(max_length=30)
    body = models.TextField()
    date_posted = models.DateField(auto_now_add=True)
    tags = TagField()

    def set_tags(self, tags):
        Tag.objects.update_tags(self, tags)

    def get_tags(self, tags):
        return Tag.objects.get_for_object(self)      

【讨论】:

    【解决方案2】:

    form.tags 在您的表单中定义为带有TextArea 小部件的CharField。因此,当您访问 form.tags 时,您访问的是该字段,而不是底层的 tags 模型属性(我假设它是某种 m2m)。

    如果没有看到你的模型,就不可能准确地告诉你如何实现你想要做的事情,但一般的想法是你需要迭代标签对象,而不是表单字段。

    【讨论】:

    【解决方案3】:
    {% for tag in form.tags.choices %}{{tag.1}}{% endfor %}
    

    【讨论】:

    猜你喜欢
    • 2015-09-10
    • 2012-01-20
    • 2013-05-07
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2018-10-10
    相关资源
    最近更新 更多