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

كيفية الحصول على أسماء وقيم الحقول من نموذج model في جانغو Django؟

Amer Abdallah

السؤال

أحاول إنشاء قالب 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...