মডেল উদাহরণ ক্ষেত্রের নাম এবং টেমপ্লেটের মানগুলির তুলনায় Iterate


183

আমি নির্বাচিত দৃষ্টান্তের ক্ষেত্রের মানগুলি এবং তাদের নামগুলি প্রদর্শনের জন্য একটি প্রাথমিক টেম্পলেট তৈরি করার চেষ্টা করছি। প্রথম কলামে ক্ষেত্রের নাম (verbose_name বিশেষত ক্ষেত্রের ক্ষেত্রে নির্দিষ্ট করা থাকে) এবং দ্বিতীয় কলামে that ক্ষেত্রের মান সহ এটি টেবিল বিন্যাসে সেই উদাহরণের মানগুলির কেবলমাত্র একটি স্ট্যান্ডার্ড আউটপুট হিসাবে ভাবেন।

উদাহরণস্বরূপ, ধরা যাক আমাদের নীচের মডেল সংজ্ঞা রয়েছে:

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

আমি এটির মতো টেমপ্লেটে আউটপুট হতে চাই (প্রদত্ত মানগুলির সাথে একটি উদাহরণ ধরুন):

Field Name      Field Value
----------      -----------
Name            Wayne Koorts
E-mail          waynes@email.com

আমি যা অর্জন করতে চাইছি তা হ'ল মডেলটির একটি উদাহরণ কোনও টেম্পলেটে স্থান দিতে সক্ষম হয়েছে এবং টেমপ্লেটে গতিশীলভাবে এটির উপরে পুনরাবৃত্তি করতে সক্ষম হবেন: এরকম কিছু:

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

এটি করার জন্য কি কোনও ঝরঝরে, "জ্যাঙ্গো-অনুমোদিত" উপায় আছে? এটি একটি খুব সাধারণ কাজ বলে মনে হচ্ছে এবং এই নির্দিষ্ট প্রকল্পের জন্য আমার প্রায়শই এটি করা প্রয়োজন।

উত্তর:


171

model._meta.get_all_field_names()আপনাকে সমস্ত মডেলের ক্ষেত্রের নাম দেবে, তারপরে আপনি model._meta.get_field()ভার্বোজের নামের সাথে নিজের কাজ করতে এবং getattr(model_instance, 'field_name')মডেল থেকে মান পেতে পারেন use

দ্রষ্টব্য: model._meta.get_all_field_names()জ্যাঙ্গো ১.৯-এ অবহিত করা হয়েছে। পরিবর্তে model._meta.get_fields()মডেলের ক্ষেত্রগুলি field.nameপেতে এবং প্রতিটি ক্ষেত্রের নাম পেতে ব্যবহার করুন ।


2
এটি এখনও খুব ম্যানুয়াল, এবং আমি ভিউতে কিছু ধরণের মেটা অবজেক্ট তৈরি করতে চাই যা আমি তার পরে টেমপ্লেটে প্রবেশ করি, যা আমার চেয়ে বেশি হ্যাক of অবশ্যই একটি সুন্দর উপায় আছে?
ওয়েইন কোয়ার্টস

2
মডেলফর্মের মতো আপনি এই সমস্ত কিছু ক্লাসে সজ্জিত করতে পারেন।
Ignacio Vazquez-Abram 3

18
আমি বিশ্বাস করি না আপনি টেমপ্লেটগুলিতে কোনও _ পদ্ধতিতে কল করতে পারেন।
ইস্যাক কেলি

2
এটি কাজ করে তবে এটি অর্জনের জন্য আপনার কোনও ব্যক্তিগত API (যেমন এটি "_" এর উপসর্গ হিসাবে থাকে) এর উপর নির্ভর করে না। প্রাইভেট এপিআই-র উপর নির্ভর করার সমস্যাটি হ'ল ব্যক্তিগত পদ্ধতিগুলি সংস্করণ থেকে সংস্করণে কাজ করার গ্যারান্টিযুক্ত নয়।
দেবী

1
আমি মনে করি যে এই পদ্ধতিটি পছন্দ করা উচিত নয় কারণ আমরা টেমপ্লেটগুলি থেকে আন্ডারস্কোর দিয়ে শুরু করা গুণাবলী অ্যাক্সেস করা উচিত নয়
GP92

72

আপনি জ্যাঙ্গোর টু পাইথন ক্যোয়ারেট সিরিয়াল ব্যবহার করতে পারেন ।

আপনার ভিউতে কেবল নিম্নলিখিত কোডটি রাখুন:

from django.core import serializers
data = serializers.serialize( "python", SomeModel.objects.all() )

এবং তারপরে টেমপ্লেটে:

{% for instance in data %}
    {% for field, value in instance.fields.items %}
        {{ field }}: {{ value }}
    {% endfor %}
{% endfor %}

এর দুর্দান্ত সুবিধা হ'ল এটি সম্পর্কের ক্ষেত্রগুলি পরিচালনা করে।

ক্ষেত্রের উপসেটের জন্য চেষ্টা করুন:

data = serializers.serialize('python', SomeModel.objects.all(), fields=('name','size'))

এটি দুর্দান্ত - তবে এই পদ্ধতির সাহায্যে কেউ কীভাবে ফলাফলগুলি কেবলমাত্র নির্দিষ্ট ক্ষেত্রের মধ্যে সীমাবদ্ধ করবে?
হারমান স্কাফ

2
এটি সুনির্দিষ্ট উত্তর হওয়া উচিত, বিদেশী কীগুলি এবং কোনও ব্যক্তিগত এপিআই কলগুলি পরিচালনা করে না। দুর্দান্ত উত্তর, ধন্যবাদ।
ইয়ুন্টি

3
এটি সিরিয়ালাইজ ব্যবহার করার প্রয়োজন নেই। আপনি একটি ক্যোরিসেটের মান () পদ্ধতিটি ব্যবহার করতে পারেন , যা একটি অভিধান প্রদান করে। আরও, এই পদ্ধতিটি সাবসেট করার জন্য ক্ষেত্রগুলির একটি তালিকা গ্রহণ করে। লিঙ্ক দেখুন । আমার সম্পূর্ণ উত্তর দেখুন।
ব্যবহারকারী 3062149

আমরা কি এটি লুপের মধ্যে প্রক্রিয়া না করে কেবল .felds এ প্রেরণে আপডেট করতে পারি? আমি মডেল / টেবিলের নামগুলি প্রকাশ করতে চাই না
হারানো কোডার

এই পদ্ধতিটি কি verbose_nameক্ষেত্রটির মধ্য দিয়ে যেতে দেয়?
ওরফে51

70

অবশেষে ডেভ মেইলিং তালিকায় এটির একটি ভাল সমাধান খুঁজে পাওয়া গেল :

ভিউতে যোগ করুন:

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 %}

1
ভাল সমাধান, তবে খুব জেনেরিক নয় কারণ এটি বিদেশী কে ক্ষেত্রগুলির জন্য মডেল_ থেকে_ডিক্ট না করে, তবে ইউনিকোড ফলাফল দেয়, তাই আপনি জটিল বিষয়টিকে ডিকের মধ্যে সহজেই সিরিয়ালাইজ করতে পারবেন না
ভেসটেল

22
বস্তুটিকে ওভাররাইড করা বিপজ্জনক, আপনার অন্য কিছু পরিবর্তনযোগ্য নাম ব্যবহার করা উচিত।
এমিল স্টেনস্ট্রোম

ধন্যবাদ! ফরেনকি কে পরিচালনা করতে আমি জ্যাঙ্গোর মডেল_ট_ডিক্ট () প্রতিস্থাপন করেছি। দয়া করে আমার পৃথক উত্তর দেখুন (মন্তব্যগুলি কোড ফর্ম্যাটিং সমর্থন করে না বলে আমি আমার আগের মন্তব্যটি মুছে ফেলেছি Sorry দুঃখিত, আমি এটি জানতাম না))
ম্যাগনাস গুস্তাভসন

2
এখানে Assuming যে FooFormএকটি হল ModelForm, চাই এটা শুধু করতে সহজ হতে: FooForm(instance=Foo.objects.get(pk=object_id)))?
বেরু

কোনও ধারণা আপনি কীভাবে কেবল এই পদ্ধতিতে সম্পাদনযোগ্য ক্ষেত্রগুলি প্রদর্শন করবেন?
ওরফে ৫১

22

জাজানো 1.8 এর প্রকাশের আলোকে (এবং মডেল _মেটা এপিআই এর আনুষ্ঠানিককরণ) , আমি ভেবেছিলাম যে আরও সাম্প্রতিক উত্তর দিয়ে আমি এটি আপডেট করব।

একই মডেল ধরে নিচ্ছি:

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

জ্যাঙ্গো <= 1.7

fields = [(f.verbose_name, f.name) for f in Client._meta.fields]
>>> fields
[(u'ID', u'id'), (u'name', u'name'), (u'E-mail', u'email')]

জ্যাঙ্গো 1.8+ (আনুষ্ঠানিকভাবে মডেল _মেটা এপিআই)

জ্যাঙ্গো ১.৮ এ পরিবর্তন হয়েছে:

মডেল _metaএপিআই সর্বদা জ্যাঙ্গো অভ্যন্তরীণ হিসাবে বিদ্যমান, তবে আনুষ্ঠানিকভাবে নথিভুক্ত ও সমর্থিত ছিল না। এই এপিআইটিকে সর্বজনীন করার প্রচেষ্টার অংশ হিসাবে, ইতিমধ্যে বিদ্যমান কিছু এপিআই এন্ট্রি পয়েন্ট কিছুটা পরিবর্তন হয়েছে। আপনার কোডটি নতুন, অফিসিয়াল এপিআই ব্যবহার করতে রূপান্তর করতে সহায়তা করার জন্য একটি মাইগ্রেশন গাইড সরবরাহ করা হয়েছে।

নীচের উদাহরণে, আমরা এর মাধ্যমে কোনও মডেলের সমস্ত ক্ষেত্রের উদাহরণ পুনরুদ্ধারের জন্য আনুষ্ঠানিক পদ্ধতিটি ব্যবহার করব Client._meta.get_fields():

fields = [(f.verbose_name, f.name) for f in Client._meta.get_fields()]
>>> fields
[(u'ID', u'id'), (u'name', u'name'), (u'E-mail', u'email')]

আসলে, এটি আমার নজরে আনা হয়েছে যে উপরে যা প্রয়োজন হয়েছিল তার জন্য উপরেরটি কিছুটা ওভারবোর্ড (আমি সম্মত!)। সহজ জটিল চেয়ে ভাল। আমি উপরোক্ত রেফারেন্সের জন্য রেখে যাচ্ছি। যাইহোক, টেমপ্লেটে প্রদর্শন করার জন্য, সর্বোত্তম পদ্ধতিটি হবে মডেলফর্ম ব্যবহার করা এবং একটি দৃষ্টান্তে পাস করা। আপনি ফর্মটি দিয়ে পুনরাবৃত্তি করতে পারেন (ফর্মের প্রতিটি ক্ষেত্রের সাথে পুনরাবৃত্ত হওয়ার সমতুল্য) এবং মডেল ক্ষেত্রের verbose_name পুনরুদ্ধার করতে লেবেল বৈশিষ্ট্যটি ব্যবহার করতে পারেন এবং মানটি পুনরুদ্ধার করতে মান পদ্ধতিটি ব্যবহার করতে পারেন:

from django.forms import ModelForm
from django.shortcuts import get_object_or_404, render
from .models import Client

def my_view(request, pk):
    instance = get_object_or_404(Client, pk=pk)
    
    class ClientForm(ModelForm):
        class Meta:
            model = Client
            fields = ('name', 'email')

    form = ClientForm(instance=instance)

    return render(
        request, 
        template_name='template.html',
        {'form': form}
    )

এখন, আমরা টেমপ্লেটে ক্ষেত্রগুলি রেন্ডার করব:

<table>
    <thead>
        {% for field in form %}
            <th>{{ field.label }}</th>
        {% endfor %}
    </thead>
    <tbody>
        <tr>
            {% for field in form %}
                <td>{{ field.value|default_if_none:'' }}</td>
            {% endfor %}
        </tr>
    </tbody>
</table>
 

2
মডেল ক্ষেত্রগুলিকে কোনও টেম্পলেটে রাখার "> 1.8" উপায়টি দেখানোর জন্য যদি আপনি নিজের উত্তরটি সামঞ্জস্য করেন তবে দুর্দান্ত হবে। এই মুহূর্তে আপনার উত্তর সরাসরি প্রশ্নের উত্তর দেয় না; এটি শেলের মধ্যে মডেলের ক্ষেত্রগুলি কীভাবে পাবেন তা দেখায়।
এসচার

@ এসচার - উত্তর আপডেট করেছেন! পরামর্শের জন্য ধন্যবাদ. আমি যদি কিছু মিস / মিস করি তবে আমাকে জানান!
মাইকেল বি

সম্মত। আমি মানগুলি মুদ্রণের পাশাপাশি ক্ষেত্রের নাম অন্তর্ভুক্ত করার জন্য সম্পাদনা করেছি। আপনি কি মনে করেন দেখুন।
ইশার

আপনি কোথায় মান মুদ্রণ করবেন? আমি কেবল এটি নাম এবং ভার্বোস_নাম মুদ্রণ করতে দেখছি?
ডাঃ এর্নি

@ মিশেলবি হুম। আমি "ফিল্ড। মূল্য" কাজ করতে সক্ষম হইনি; ক্ষেত্রগুলি প্রকৃত কলামের ডেটা নয়, ডাটাবেস ক্ষেত্র হিসাবে উপস্থিত। আমাকে একটি ফিল্টার ব্যবহার করতে হয়েছিল যা বলে গ্যাটআটার (বস্তু, নাম)। জ্যাঙ্গোর কোন সংস্করণটি আপনার পক্ষে কাজ করে?
ডাঃ এরনি

19

একটি মডেল পদ্ধতি ব্যবহার করে এখানে আরও একটি পদ্ধতি দেওয়া হয়েছে। এই সংস্করণটি পিকলিস্ট / পছন্দ ক্ষেত্রগুলি সমাধান করে, খালি ক্ষেত্রগুলি এড়িয়ে যায় এবং আপনাকে নির্দিষ্ট ক্ষেত্রগুলি বাদ দিতে দেয়।

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        
        # resolve picklists/choices, with get_xyz_display() function
        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

        # only display fields with values and skip some fields entirely
        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 %}

3
তোমার দরকার কেন except User.DoesNotExist:?
সিরিয়েনার্থস

আমি ব্যবহারকারীর পরিবর্তে অ্যাট্রিবিউটআরার ব্যবহার করতে আগ্রহী। ডোনস নটএক্সিস্ট - এটি কেন ব্যবহারকারীর জন্য নিক্ষেপ করবে তা আমি দেখতে পাচ্ছি না oes ডোনস নটএক্সিস্ট।
Askvictor

এছাড়াও, self._meta.get_fields () ব্যবহার করা আরও ভাল হতে পারে কারণ এটি আনুষ্ঠানিকভাবে জাঙ্গো 1.8+ এ প্রকাশিত হয়েছে। যাইহোক, তারপরে আপনি কোডের সাথে সম্পর্কের সাথে সমাপ্ত হন, যা আপনাকে f.is_relation চেক করে ফিল্টার আউট করতে হবে
by

আমি ব্যবহারকারীর পরিবর্তে অ্যাট্রিবিউটআরার ব্যবহার করার জন্য উত্তরটি সম্পাদনা করেছি oes ডোনস নটএক্সিস্ট (যা আমার আসল বাস্তবায়ন থেকে একটি বাকী ছিল)। ধন্যবাদ। আমি _meta.get_fields()এটি পরীক্ষা না করা অবধি থামিয়ে রেখেছি।
শেকার

13

ঠিক আছে, আমি জানি এটি কিছুটা দেরি হয়ে গেছে, তবে যেহেতু সঠিক উত্তরটি খুঁজে পাওয়ার আগে আমি এই হোঁচট খেয়েছি যাতে অন্য কেউ হতে পারে।

থেকে জ্যাঙ্গো ডক্স :

# This list contains a Blog object.
>>> Blog.objects.filter(name__startswith='Beatles')
[<Blog: Beatles Blog>]

# This list contains a dictionary.
>>> Blog.objects.filter(name__startswith='Beatles').values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]

আমি এই উত্তর পছন্দ। যদি আপনার ক্যোয়ারী আরও একটি করে রেকর্ড দেয় এবং আপনি কেবল সর্বশেষতমটি চান তবে নিম্নলিখিতটি করুন। 1. নিশ্চিত করুন যে আপনি আছে ordering = ['-id']মধ্যে class Meta:আপনার বস্তুর models.py। 2. তারপরে ব্যবহার করুনBlog.objects.filter(name__startswith='Beatles').values()[0]
12'10

চতুর ধারণা। তবে আপনার যদি ইতিমধ্যে কোনও modelঅবজেক্ট থাকে তবে আপনি ক্ষেত্রগুলি পাওয়ার জন্য আপনি আবার ডাটাবেসটিকে হিট করবেন। কোন পথে?
frnhr

@ ব্যবহারকারী 1763732 সবেমাত্র ক্যোরিসেটের জন্য ডকুমেন্টেশনগুলি পরীক্ষা করুন: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
en/

9

আপনি values()ক এর পদ্ধতিটি ব্যবহার করতে পারেন queryset, যা একটি অভিধান প্রদান করে। আরও, এই পদ্ধতিটি সাবসেট করার জন্য ক্ষেত্রগুলির একটি তালিকা গ্রহণ করে। values()পদ্ধতি সাথে কাজ করবে না get(), তাই আপনি ব্যবহার করা আবশ্যক filter()(পড়ুন QuerySet এপিআই )।

ইন view...

def show(request, object_id):
   object = Foo.objects.filter(id=object_id).values()[0]
   return render_to_response('detail.html', {'object': object})

ইন detail.html...

<ul>
   {% for key, value in object.items %}
        <li><b>{{ key }}:</b> {{ value }}</li>
   {% endfor %}
</ul>

একটি জন্য দৃষ্টান্ত সংগ্রহ ফিল্টার দ্বারা ফিরে:

   object = Foo.objects.filter(id=object_id).values() # no [0]

বিস্তারিত html ...

{% for instance in object %}
<h1>{{ instance.id }}</h1>
<ul>
    {% for key, value in instance.items %}
        <li><b>{{ key }}:</b>  {{ value }}</li>
    {% endfor %}
</ul>
{% endfor %}

এটি আশ্চর্যজনক, আপনাকে ধন্যবাদ! আমি একটি প্রশ্ন পেয়েছি, আপনি যদি আমাকে সাহায্য করতে পারেন; আমি একটিতে সমস্ত অবজেক্টের ডেটা রাখছি table, সুতরাং আমার প্রতিটি keyএস এ দরকার th। আমি লুপগুলি ছাড়া এটি কীভাবে করব? কেবল কোনও বস্তুর উদাহরণ নিন এবং এর মাধ্যমে পুনরুক্তি করবেন key? বর্তমানে আমি আলাদাভাবে পার করছি model_to_dict(Model())জন্য th, কিন্তু আমি মনে করি এটা একটি অপ্রয়োজনীয় বস্তুর ইনস্ট্যান্স আছে।
অক্সভিভি

চমত্কার উত্তর। ব্যক্তিগতভাবে, আমি এটি তালিকা ভিউ এবং বিস্তারিত দর্শন উভয় ক্ষেত্রেই ব্যবহার করেছি। তালিকার ভিউ বাস্তবায়নের ক্ষেত্রে বহুলাংশে সুস্পষ্ট, তবে বিস্তারিত দৃশ্যের সাথে আমি get_objectবিশদ ভিউটিতে ওভাররাইড করি (মন্তব্যে ইনলাইন কোড সীমাবদ্ধতার কারণে ম্যাঙ্গেলড, এবং এই থ্রেডটি কতটা স্যাচুরেটেড তা বিবেচনা করে এটির নিজস্ব উত্তরের জন্য এটি যথেষ্ট মনে হয় না): def get_object(self, **kwargs): obj = super().get_object(**kwargs) obj = obj.__class__.objects.filter(pk=obj.pk).values()[0] return obj
sdconrox

obj.get_absolute_urlসারিগুলির সদৃশ না করে আপনি কীভাবে এই তালিকায় যুক্ত করবেন?
ওরফে 51

8

আমি https://stackoverflow.com/a/3431104/2022534 ব্যবহার করেছি তবে বিদেশী কে হ্যান্ডেল করতে সক্ষম হতে জ্যাঙ্গোর মডেল_ট_ডিক্ট () এর সাথে প্রতিস্থাপন করেছি:

def model_to_dict(instance):
    data = {}
    for field in instance._meta.fields:
        data[field.name] = field.value_from_object(instance)
        if isinstance(field, ForeignKey):
            data[field.name] = field.rel.to.objects.get(pk=data[field.name])
    return data

অনুগ্রহ করে নোট করুন যে আমার যে অরিজিনাল প্রয়োজন ছিল না সেগুলি মুছে ফেলে আমি এটি বেশ খানিকটা সরলীকরণ করেছি। আপনি তাদের পিছনে রাখতে চান।


8

আপনার জন্য কাজটি করতে একটি ফর্ম থাকতে পারে।

def my_model_view(request, mymodel_id):
    class MyModelForm(forms.ModelForm):
        class Meta:
            model = MyModel

    model = get_object_or_404(MyModel, pk=mymodel_id)
    form = MyModelForm(instance=model)
    return render(request, 'model.html', { 'form': form})

তারপরে টেমপ্লেটে:

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

3
এই পদ্ধতিটি (এ এর মধ্যে নিযুক্ত DetailView) আমার পক্ষে ভাল কাজ করে। তবে আপনি এর field.labelপরিবর্তে ব্যবহার করতে ইচ্ছুক হতে পারেন field.name
ডেভিড কেইন

7

এটি করার জন্য একটি অন্তর্নিহিত উপায় থাকা উচিত। আমি এই ইউটিলিটিটি লিখেছি build_pretty_data_viewযা একটি মডেল অবজেক্ট এবং ফর্ম উদাহরণ গ্রহণ করে (আপনার মডেলের উপর ভিত্তি করে একটি ফর্ম) এবং একটি প্রদান করেSortedDict

এই সমাধানের সুবিধার মধ্যে রয়েছে:

  • এটি জ্যাঙ্গোর অন্তর্নির্মিত ব্যবহার করে অর্ডার সংরক্ষণ করে SortedDict
  • যখন লেবেল / ভার্বোস_নামটি পাওয়ার চেষ্টা করে, তবে কোনওটি সংজ্ঞায়িত না করা থাকলে ক্ষেত্রের নামটিতে ফিরে যায়।
  • এটি optionচ্ছিকভাবে একটিও নেবে exclude() নির্দিষ্ট ক্ষেত্রগুলি বাদ দেওয়ার জন্য fieldচ্ছিকভাবে ক্ষেত্রের নামের তালিকাও ।
  • যদি আপনার ফর্ম শ্রেণিতে একটি অন্তর্ভুক্ত থাকে Meta: exclude()তবে আপনি এখনও মানগুলি ফিরিয়ে দিতে চান তবে সেই ক্ষেত্রগুলি theচ্ছিক append()তালিকায় যুক্ত করুন।

এই সমাধানটি ব্যবহার করতে প্রথমে এই ফাইলটি / ফাংশনটি যুক্ত করুন, তারপরে এটি আপনার আমদানি করুন views.py

utils.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: ai ts=4 sts=4 et sw=4
from django.utils.datastructures import SortedDict


def build_pretty_data_view(form_instance, model_object, exclude=(), append=()):
    i=0
    sd=SortedDict()

    for j in append:
        try:
            sdvalue={'label':j.capitalize(),
                     'fieldvalue':model_object.__getattribute__(j)}
            sd.insert(i, j, sdvalue)
            i+=1
        except(AttributeError):
            pass

    for k,v in form_instance.fields.items():
        sdvalue={'label':"", 'fieldvalue':""}
        if not exclude.__contains__(k):
            if v.label is not None:
                sdvalue = {'label':v.label,
                           'fieldvalue': model_object.__getattribute__(k)}
            else:
                sdvalue = {'label':k,
                           'fieldvalue': model_object.__getattribute__(k)}
            sd.insert(i, k, sdvalue)
            i+=1
    return sd

সুতরাং এখন আপনার মধ্যে views.pyআপনি এই জাতীয় কিছু করতে পারেন

from django.shortcuts import render_to_response
from django.template import RequestContext
from utils import build_pretty_data_view
from models import Blog
from forms import BlogForm
.
.
def my_view(request):
   b=Blog.objects.get(pk=1)
   bf=BlogForm(instance=b)
   data=build_pretty_data_view(form_instance=bf, model_object=b,
                        exclude=('number_of_comments', 'number_of_likes'),
                        append=('user',))

   return render_to_response('my-template.html',
                          RequestContext(request,
                                         {'data':data,}))

এখন আপনার my-template.htmlটেমপ্লেটে আপনি এমন ডেটা নিয়ে পুনরাবৃত্তি করতে পারেন ...

{% for field,value in data.items %}

    <p>{{ field }} : {{value.label}}: {{value.fieldvalue}}</p>

{% endfor %}

শুভকামনা আশা করি এটি কাউকে সাহায্য করবে!


7

নীচে আমার, শ্যাকার দ্বারা অনুপ্রাণিত get_all_fields। এটি একটি মডেলের উদাহরণ হিসাবে একটি ডিক পায়, যদি সম্পর্কের ক্ষেত্রের মুখোমুখি হয়, তবে ক্ষেত্রের মানটি একটি ডরকে পুনরাবৃত্তভাবে স্বাক্ষর করুন।

def to_dict(obj, exclude=[]):
    """生成一个 dict, 递归包含一个 model instance 数据.
    """
    tree = {}
    for field in obj._meta.fields + obj._meta.many_to_many:
        if field.name in exclude or \
           '%s.%s' % (type(obj).__name__, field.name) in exclude:
            continue

        try :
            value = getattr(obj, field.name)
        except obj.DoesNotExist:
            value = None

        if type(field) in [ForeignKey, OneToOneField]:
            tree[field.name] = to_dict(value, exclude=exclude)
        elif isinstance(field, ManyToManyField):
            vs = []
            for v in value.all():
                vs.append(to_dict(v, exclude=exclude))
            tree[field.name] = vs
        elif isinstance(field, DateTimeField):
            tree[field.name] = str(value)
        elif isinstance(field, FileField):
            tree[field.name] = {'url': value.url}
        else:
            tree[field.name] = value

    return tree

এই ফাংশনটি মূলত জেসন ডেটার একটি মডেল উদাহরণ ডাম্প করতে ব্যবহৃত হয়:

def to_json(self):
    tree = to_dict(self, exclude=('id', 'User.password'))
    return json.dumps(tree, ensure_ascii=False)

মহান কাজ! পছন্দ যোগ সুপারিশ সমর্থন ... Elif hasattr (ক্ষেত্র, 'পছন্দ'): গাছ [field.name] = অভি (field.choices) .get (মান, মান)
Oden

5

প্রতিটি মডেল সম্পাদনা করার পরিবর্তে আমি একটি টেম্পলেট ট্যাগ লেখার পরামর্শ দেব যা দেওয়া কোনও মডেলের সমস্ত ক্ষেত্রকে ফিরিয়ে দেবে ।
প্রতিটি বস্তুর ক্ষেত্রের তালিকা রয়েছে ._meta.fields
প্রতিটি ফিল্ড অবজেক্টের এট্রিবিউট থাকে nameযা এর নাম এবং পদ্ধতিটি দেয় value_to_string()যা আপনার মডেলের সাথে সরবরাহ করে objectএর মান ফিরিয়ে দেবে।
বাকিটি জ্যাঙ্গো ডকুমেন্টেশনে যেমন বলা হয়েছে তেমন সহজ ।

এই টেম্পলেটট্যাগটি দেখতে কেমন হতে পারে তা এখানে আমার উদাহরণ:

    from django.conf import settings
    from django import template

    if not getattr(settings, 'DEBUG', False):
        raise template.TemplateSyntaxError('get_fields is available only when DEBUG = True')


    register = template.Library()

    class GetFieldsNode(template.Node):
        def __init__(self, object, context_name=None):
            self.object = template.Variable(object)
            self.context_name = context_name

        def render(self, context):
            object = self.object.resolve(context)
            fields = [(field.name, field.value_to_string(object)) for field in object._meta.fields]

            if self.context_name:
                context[self.context_name] = fields
                return ''
            else:
                return fields


    @register.tag
    def get_fields(parser, token):
        bits = token.split_contents()

        if len(bits) == 4 and bits[2] == 'as':
            return GetFieldsNode(bits[1], context_name=bits[3])
        elif len(bits) == 2:
            return GetFieldsNode(bits[1])
        else:
            raise template.TemplateSyntaxError("get_fields expects a syntax of "
                           "{% get_fields <object> [as <context_name>] %}")

4

হ্যাঁ এটি সুন্দর নয়, আপনাকে নিজের র‍্যাপারটি তৈরি করতে হবে। Builtin কটাক্ষপাত databrowse অ্যাপ্লিকেশন, যা সব কার্যকারিতা আপনি কি সত্যিই প্রয়োজন আছে।


আমি বলছিলাম ... ডাটাব্রোস ঠিক এটি করে, যদিও আমি এটি একটি সম্পূর্ণ অকেজো অ্যাপ হিসাবে খুঁজে পেয়েছি।
এমপিএন

4

এটি হ্যাক হিসাবে বিবেচিত হতে পারে তবে মডেল রূপটিকে ফর্মে রূপ দেওয়ার জন্য মডেলফর্ম_ফ্যাক্টরিটি ব্যবহার করার আগে আমি এটি করেছি।

ফর্ম শ্রেণীর ভিতরে আরও অনেক তথ্য রয়েছে যা পুনরাবৃত্তি করা অত্যন্ত সহজ এবং এটি আরও কিছুটা ওভারহেড ব্যয় করে একই উদ্দেশ্যে কাজ করবে। যদি আপনার সেট আকারগুলি তুলনামূলকভাবে ছোট হয় তবে আমি মনে করি পারফরম্যান্সের প্রভাবটি নগণ্য হবে।

অবশ্যই সুবিধার পাশাপাশি একটি সুবিধা হ'ল আপনি পরবর্তী কোনও তারিখে সহজেই টেবিলটিকে সম্পাদনযোগ্য ডেটাগ্রিডে পরিণত করতে পারেন।


4

আমি নিম্নলিখিত পদ্ধতিটি নিয়ে এসেছি, যা আমার পক্ষে কাজ করে কারণ প্রতিটি ক্ষেত্রেই মডেলটির সাথে একটি মডেলফর্ম যুক্ত থাকে।

def GetModelData(form, fields):
    """
    Extract data from the bound form model instance and return a
    dictionary that is easily usable in templates with the actual
    field verbose name as the label, e.g.

    model_data{"Address line 1": "32 Memory lane",
               "Address line 2": "Brainville",
               "Phone": "0212378492"}

    This way, the template has an ordered list that can be easily
    presented in tabular form.
    """
    model_data = {}
    for field in fields:
        model_data[form[field].label] = eval("form.data.%s" % form[field].name)
    return model_data

@login_required
def clients_view(request, client_id):
    client = Client.objects.get(id=client_id)
    form = AddClientForm(client)

    fields = ("address1", "address2", "address3", "address4",
              "phone", "fax", "mobile", "email")
    model_data = GetModelData(form, fields)

    template_vars = RequestContext(request,
        {
            "client": client,
            "model_data": model_data
        }
    )
    return render_to_response("clients-view.html", template_vars)

এই বিশেষ দর্শনটির জন্য আমি যে টেম্পলেটটি ব্যবহার করছি তা থেকে এখানে একটি নির্যাস দেওয়া হয়েছে:

<table class="client-view">
    <tbody>
    {% for field, value in model_data.items %}
        <tr>
            <td class="field-name">{{ field }}</td><td>{{ value }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>

এই পদ্ধতির সুন্দর জিনিসটি হ'ল আমি টেম্পলেট-দ্বারা-টেম্পলেট ভিত্তিতে যে ক্ষেত্রের লেবেলগুলি প্রদর্শন করতে চাই তা চয়ন করতে পারি, গেটমোডেলডাটাতে প্রদত্ত টিপলটি ব্যবহার করে এবং ক্ষেত্রের নাম উল্লেখ করে। এটি আমাকে নির্দিষ্ট ক্ষেত্রগুলি (যেমন একটি ব্যবহারকারী বিদেশী কী) বাদ দিতে দেয় কারণ কেবলমাত্র টিপলের মাধ্যমে প্রবেশ করা ফিল্ডের নামগুলি চূড়ান্ত অভিধানে অন্তর্নির্মিত হয়।

আমি এটিকে উত্তর হিসাবে গ্রহণ করতে যাচ্ছি না কারণ আমি নিশ্চিত কেউ আরও কিছু "জ্যাঙ্গোনিক" নিয়ে আসতে পারে :-)

আপডেট: আমি এটিকে চূড়ান্ত উত্তর হিসাবে বেছে নিচ্ছি কারণ যা দেওয়া দরকার তার মধ্যে এটি সবচেয়ে সহজ what যারা উত্তর প্রদান করেছেন তাদের সবাইকে ধন্যবাদ।


3

আমার জন্য জ্যাঙ্গো 1.7 সমাধান:

ভেরিয়েবলগুলি প্রশ্নের সঠিক, তবে আপনি অবশ্যই এই উদাহরণটি ছড়িয়ে দিতে সক্ষম হবেন

এখানে মূল চাবিকাঠিটি হ'ল .__dict__মডেল
ভিউপিপি ব্যবহার করে :

def display_specific(request, key):
  context = {
    'question_id':question_id,
    'client':Client.objects.get(pk=key).__dict__,
  }
  return render(request, "general_household/view_specific.html", context)

টেমপ্লেট :

{% for field in gen_house %}
    {% if field != '_state' %}
        {{ gen_house|getattribute:field }}
    {% endif %}
{% endfor %}

টেমপ্লেটটিতে আমি
ডিক্ট ফিল্টার.পিতে ক্ষেত্রটি অ্যাক্সেস করতে একটি ফিল্টার ব্যবহার করেছি :

@register.filter(name='getattribute')
def getattribute(value, arg):
  if value is None or arg is None:
    return ""
  try:
    return value[arg]
  except KeyError:
    return ""
  except TypeError:
    return ""

2

আমি এটি ব্যবহার করছি, https://github.com/miracle2k/django-tables

<table>
<tr>
    {% for column in table.columns %}
    <th><a href="?sort={{ column.name_toggled }}">{{ column }}</a></th>
    {% endfor %}
</tr>
{% for row in table.rows %}
    <tr>
    {% for value in row %}
        <td>{{ value }}</td>
    {% endfor %}
    </tr>
{% endfor %}
</table>

2

এই পদ্ধতিটি দেখায় যে কীভাবে জাঙ্গোর মডেলফর্মের মতো শ্রেণি এবং {{form.as_table} like এর মতো একটি টেম্পলেট ট্যাগ ব্যবহার করা যায় তবে সমস্ত টেবিলটি কোনও ফর্মের মতো নয়, ডেটা আউটপুটের মতো লাগে।

প্রথম পদক্ষেপটি ছিল জাঙ্গোর পাঠ্য ইনপুট উইজেট সাবক্লাস করা:

from django import forms
from django.utils.safestring import mark_safe
from django.forms.util import flatatt

class PlainText(forms.TextInput):
    def render(self, name, value, attrs=None):
        if value is None:
            value = ''
        final_attrs = self.build_attrs(attrs)
        return mark_safe(u'<p %s>%s</p>' % (flatatt(final_attrs),value))

তারপরে আমি পাঠ্য সংস্করণগুলির জন্য ডিফল্ট উইজেটগুলি সরিয়ে নিতে জ্যাঙ্গোর মডেলফর্ম সাবক্লাস করেছি:

from django.forms import ModelForm

class ReadOnlyModelForm(ModelForm):
    def __init__(self,*args,**kwrds):
        super(ReadOnlyModelForm,self).__init__(*args,**kwrds)
        for field in self.fields:
            if isinstance(self.fields[field].widget,forms.TextInput) or \
               isinstance(self.fields[field].widget,forms.Textarea):
                self.fields[field].widget=PlainText()
            elif isinstance(self.fields[field].widget,forms.CheckboxInput):
                self.fields[field].widget.attrs['disabled']="disabled" 

সেগুলি ছিল আমার একমাত্র উইজেট। তবে এই ধারণাটি অন্যান্য উইজেটগুলিতে প্রসারিত করা কঠিন হবে না।


1

@ ওয়ান্ডার এর একটি সম্পাদনা মাত্র

def to_dict(obj, exclude=[]):
    tree = {}
    for field in obj._meta.fields + obj._meta.many_to_many:
        if field.name in exclude or \
           '%s.%s' % (type(obj).__name__, field.name) in exclude:
            continue
        try :
            value = getattr(obj, field.name)
        except obj.DoesNotExist as e:
            value = None
        except ObjectDoesNotExist as e:
            value = None
            continue
        if type(field) in [ForeignKey, OneToOneField]:
            tree[field.name] = to_dict(value, exclude=exclude)
        elif isinstance(field, ManyToManyField):
            vs = []
            for v in value.all():
                vs.append(to_dict(v, exclude=exclude))
            tree[field.name] = vs
        else:
            tree[field.name] = obj.serializable_value(field.name)
    return tree

জ্যাঙ্গো সম্পর্কিত ক্ষেত্রগুলি বাদে অন্য সমস্ত ক্ষেত্রগুলি পরিচালনা করতে দিন। আমি মনে করি এটি আরও স্থিতিশীল



0

আমি শেলের মধ্যে এই জাতীয় কিছু পরীক্ষা করেছি এবং মনে হয় এটি কাজ করে:

my_object_mapped = {attr.name: str(getattr(my_object, attr.name)) for attr in MyModel._meta.fields}

নোট করুন যে আপনি যদি বিদেশী অবজেক্টের জন্য স্ট্রিং () উপস্থাপনা চান তবে আপনার এটির স্ট্রেড পদ্ধতিতে এটি সংজ্ঞায়িত করা উচিত । এটি থেকে আপনার কাছে অবজেক্টের জন্য মূল্য রয়েছে। তারপরে আপনি কিছু ধরণের টেম্পলেট বা যা কিছু রেন্ডার করতে পারেন।


0

জ্যাঙ্গো> = ২.০

যোগ get_fields()আপনার টু models.py:

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

    def get_fields(self):
        return [(field.verbose_name, field.value_from_object(self)) for field in self.__class__._meta.fields]

তারপরে এটিকে যেমন কল object.get_fieldsকরুন template.html:

<table>
    {% for label, value in object.get_fields %}
        <tr>
            <td>{{ label }}</td>
            <td>{{ value }}</td>
        </tr>
    {% endfor %}
</table>

-1

<table border='1'>
	<tr>
		{% for mfild in fields%}
			<td>{{mfild}}</td>
		{% endfor%}
	</tr>
    {%for v in records%}
        <tr>
        	<td>{{v.id}}</td>
        	<td>{{v.title}}</td>
        	<td class="">{{v.desc}}</td>

        </tr>

    {% endfor%}
 </table>
 
 
enter code here


1
হ্যালো এবং এসও আপনাকে স্বাগতম। দয়া করে কেবল উত্তরগুলি পোস্ট করবেন না। এছাড়াও এই প্রশ্নের ইতিমধ্যে একটি স্বীকৃত উত্তর রয়েছে, আপনার কোড ফর্ম্যাটিং সঠিক নয়, আপনি অবচয়যুক্ত এইচটিএমএল বৈশিষ্ট্যগুলি ব্যবহার করছেন এবং সবচেয়ে গুরুত্বপূর্ণ: আপনি কীভাবে কোডটি গৃহীত উত্তরগুলির চেয়ে আরও ভাল সমাধান সরবরাহ করে তা ব্যাখ্যা করছেন না।
ফ্রাইডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.