اذهب إلى المحتوى

السؤال

نشر

أحاول إنشاء قالب template لعرض قيم حقول نموذج المحدد ، إلى جانب أسماء الحقول. على سبيل المثال، لنفترض أن لدي النموذج التالي:

class User(Model):
    name = CharField(max_length=150)
    email = EmailField(max_length=100, verbose_name="E-mail")

أرغب في إخراج البيانات السابقة في قالب معين لتكون النتيجة كالتالي:

name            My Full Name
E-mail          mail@example.com

لذلك أحاول أن أقوم بعمل القالب بالشكل التالي:

<table>
    {% for field in fields %}
        <tr>
            <td>{{ field.name }}</td>
            <td>{{ field.value }}</td>
        </tr>
    {% endfor %}
</table>

بالطبع الكود السابق لن يعمل، ولكن هذا ما أحاول أن أقوم به، هل هناك طريقة يوفرها جانغو Django للقيام بذلك؟

Recommended Posts

  • 1
نشر

يوفر جانغو Django طريقة للحصول على أسماء الحقول وقيمها أيضًا من خلال التابع get_fields والذي يقوم بإرجاع tuple من أسماء الحقول، ويمكنك إستخدامه كالتالي:

from django.contrib.auth.models import User

fields = User._meta.get_fields()
for field in fields:
  print(field.name)

وإن كنت تريد المرور على كل الكائنات في نموذج معين فيمكنك أن تستخدم serializers، على النحو التالي:

from django.core import serializers

users = serializers.serialize("python", User.objects.all())

ثم في القالب:

{% for user in users %}
    {% for field, value in user.fields.items %}
        {{ field }}: {{ value }}
    {% endfor %}
{% endfor %}

وإن أردت عرض حقول معينة، فيمكنك إضافة الخاصية fields، كالتالي:

from django.core import serializers

users = serializers.serialize("python", User.objects.all(), fields=('name','email'))

 

  • 0
نشر (معدل)

يمكنك استخدام الدالة 

model._meta.get_all_field_names()
#استخدام الكود التالي عوضا اذا كنت تستخدم نسخه 1.9

model._meta.get_fields()

لعرض اسماء الحقول في النموذج. كذلك يمكنك استخدام:

model._meta.get_field()

لتستطيع التعامل مع اسماء verbose. ويمكنك استخدام:

etattr(model_instance, 'field_name')

للتعامل مع قيم الحقول

تم التعديل في بواسطة Ahmed Sharshar
  • 0
نشر

إضافة إلى الحلول التي ذكرها سامح يمكنك استخدام model_to_dict للحصول على أسماء الحقول وقيمها بالشكل التالي:

from django.forms.models import model_to_dict
def show(request, object_id):
    object = FooForm(data=model_to_dict(Foo.objects.get(pk=object_id)))
    return render_to_response('foo/foo_detail.html', {'object': object})

ثم في القالب:

{% for field in object %}
    <li><b>{{ field.label }}:</b> {{ field.data }}</li>
{% endfor %}

 

  • 0
نشر

إليك طريقة أخرى باستخدام طريقة النموذج (model method). يمكنك باستخدام هذه الطريقة أن تتخطى الحقول الفارغة ويتيح لك استبعاد حقول محددة.

def get_all_fields(self):
    """Returns a list of all field names on the instance."""
    fields = []
    for f in self._meta.fields:

        fname = f.name        

        get_choice = 'get_'+fname+'_display'
        if hasattr(self, get_choice):
            value = getattr(self, get_choice)()
        else:
            try:
                value = getattr(self, fname)
            except AttributeError:
                value = None

        # اعرض فقط الحقول ذات القيم وتخطي بعض الحقول 
        if f.editable and value and f.name not in ('id', 'status', 'workshop', 'user', 'complete') :

            fields.append(
              {
               'label':f.verbose_name, 
               'name':f.name, 
               'value':value,
              }
            )
    return fields

ثم في القالب الخاص بك:

{% for f in app.get_all_fields %}
  <dt>{{f.label|capfirst}}</dt>
    <dd>
      {{f.value|escape|urlize|linebreaks}}
    </dd>
{% endfor %}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...