0

私は周りの「関連/重複」の質問のほとんどを読んだと思います(つまり、テンプレートタグからの冗長性、フィールドの反復、モデルの反復、その他いくつか...

残念ながら、私は手を握る必要があるのではないかと心配しています...私はdjango n00bであり、それを機能させることができないようです。これが私がhtmlに望む結果です:

<!-- this in some section of the template -->
First Name : . Joe
Last Name : .. Blogs

<!-- this in another section -->
City:  ....... Xanadu
Country: ..... Mongolia
Occupation: .. Programmer

<!-- this in another section of the template -->
Age: ......... 75 
Height: ...... 180 cm
Eye color:  .. red

4つまたは5つのセクションと10の可能なフィールドがあり、それぞれ私はやりたくない

{% if data.first_name %}
  First Name:  {{ data.first_name }}
{% endif %}

40回!:-/ ...だからここに(大まかに)私の試みがあります:

model.py

class GenericPerson(models.Model):
    first_name = models.CharField(_('First Name'),
                        max_length = 200, 
                        help_text = _('What is your name?'))

    last_name = models.CharField(_('Last Name'),
                        max_length = 200, 
                        help_text = _('What is your name?'))
    etc, etc ...

    class Meta:
        abstract = True

class Person(GenericPerson):    
    age_in_years = models.PositiveIntegerField(_('Age'), 
                null = True,
                blank = True,
                help_text=_('When was you born?, mate')) 
    location = models.ForeignKey(GeographicalProfile,
                               verbose_name=_('geolocations'),
                               null = True,
                               blank = True)

    height = ... etc, etc.

views.py

...
try:
   person = Person.objects.filter(pk=product_id)
except Person.DoesNotExist:
    raise Http404

generaldata = person.values('first_name',
                              'last_name',
                              etc, etc,
                              )[0]
localdata = person.values('city',
                              'country',
                              etc, etc
                              )[0]
physicaldata = person.values('age',
                                 'height',
                                 'eye_color',
                                  etc, etc
                                 )[0]
extra_context[data] = generaldata
extra_context[loc] = localdata
extra_context[phys] = physicaldata

return render_to_response(template_name, extra_context ,context_instance=RequestContext(request))

そのビューを使用して、私はすることができます

template.html

{% for p in phys.items %}
<ul>
  {% if p.1 %}
     <li>{{p.0}} :  {{p.1}}</li>
  {% endif %}
</ul>
{% endfor %}

さまざまなセクションのために。ただし、これにより、フィールドは(名前ではなく)age_in_years、eye_colorとして返されます。さて、上記の投稿からカスタムテンプレートタグを作成します。

from django import template
register = template.Library()

@register.filter
def get_name(object):
    return object._meta.verbose_name # put here whatever you would like to return

register.tag('get_name', get_name)

、テンプレートにロードします{%load person_extras%}、今...テンプレートのどこでもこの{{something | get_object_name}}をやみくもに使用しようとしました...しかし、理解できない私のブルートフォースは私に与えます:

'str'オブジェクトには属性'_meta'がありません

'list'オブジェクトには属性'_meta'がありません

'tuple'オブジェクトには属性'_meta'がありません

'dict'オブジェクトには属性'_meta'がありません

'ValuesQuerySet'オブジェクトには属性'_meta'がありません

では、このテンプレートタグはどこで使用しますか?または、forループでこのテンプレートタグを使用するようにビューを変更するにはどうすればよいですか?

洞察力をありがとう

4

1 に答える 1

3

を呼び出すと、オブジェクトのperson = Person.objects.filter(pk=product_id)が返されます。その後、このクエリセットで使用する場合-ドキュメントの言葉で-:QuerySetPeoplevalues

ValuesQuerySet を返します — モデル インスタンス オブジェクトではなく反復可能オブジェクトとして使用された場合に辞書を返す QuerySet サブクラス。

したがって、基本的に、テンプレートでテンプレートタグを呼び出そうとすると._meta.verbose_name、オブジェクトではなく辞書オブジェクトを呼び出そうとしていますがPerson、これは機能しません。

したがって、代わりにできることは、単純なクエリセットをテンプレートに渡し、各セクション (一般、ローカル、物理) に表示するフィールドを制限し、いくつかのテンプレート フィルターを使用して支援することです。次のようなものです:

try:
    people = Person.objects.filter(pk=product_id)
except Person.DoesNotExist:
    raise Http404

extra_context = {
    'people' : people,
    'general_fieldnames' : ['first_name', 'last_name' ...],
    'local_fieldnames' : ['age', 'weight' ...],
    'physical_fieldnames' : ['age', 'height' ...], 
}
return render_to_response(template_name, extra_context      
    ,context_instance=RequestContext(request))

ただし、(ご存知のように) オブジェクトのフィールドを反復処理したり、詳細な名前を取得したりする簡単な方法がないため、問題があります。代わりに、リストを反復処理してphysical_fieldnames、オブジェクトから対応するフィールドを取得し、フィルターを使用して詳細な名前を取得することもできます。

from django import template
register = template.Library()

@register.filter
def get_field_value(obj, field_name):
    return getattr(obj, field_name, None)

@register.filter
def get_verbose_name(obj, field_name):
    return obj._meta.get_field(field_name).verbose_name

register.tag('get_verbose_name', get_verbose_name)
register.tag('get_field_value', get_field_value)

そして今、テンプレートに

{% for person in people %}
<h1>General</h1>
<ul>
{% for field_name in general_fieldnames %}
    {{ person|get_verbose_name:field_name }} : {{ person|get_field_value:field_name }}
{% endfor %}
</ul>
{% endfor %}

...
于 2012-08-04T12:18:10.650 に答える