私は周りの「関連/重複」の質問のほとんどを読んだと思います(つまり、テンプレートタグからの冗長性、フィールド名の反復、モデルの反復、その他いくつか...)
残念ながら、私は手を握る必要があるのではないかと心配しています...私は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ループでこのテンプレートタグを使用するようにビューを変更するにはどうすればよいですか?
洞察力をありがとう