في جانغو، كيف يمكن للمرء أن استخدام طريقة عرض جانغو عام update_object لتعديل أشكال النماذج الموروثة؟

StackOverflow https://stackoverflow.com/questions/213237

سؤال

في جانغو، نظرا مقتطفات من تطبيق حيوانات likeso:

A <م> حيوانات / models.py مع:

from django.db import models
from django.contrib.contenttypes.models import ContentType

class Animal(models.Model):
  content_type = models.ForeignKey(ContentType,editable=False,null=True)
  name = models.CharField()

class Dog(Animal):
  is_lucky = models.BooleanField()

class Cat(Animal):
  lives_left = models.IntegerField()

وعلى حيوانات / urls.py :

from django.conf.urls.default import *

from animals.models import Animal, Dog, Cat

dict = { 'model' : Animal }

urlpatterns = (
  url(r'^edit/(?P<object_id>\d+)$', 'create_update.update_object', dict),
)

وكيف يمكن للمرء استخدام طرق عامة لتعديل الكلب و / أو القط باستخدام نفس النموذج؟

وأي بمعنى. و<م> النموذج الكائن الذي تم تمريره إلى <م> حيوانات / animal_form.html سيكون الحيوانية، وبالتالي لن تحتوي على أي من تفاصيل عن الفئات المشتقة الكلب والقط. كيف يمكن أن لدي جانغو تمرير تلقائيا شكل لفئة الأطفال إلى <م> حيوان / animals_form.html

وبالمناسبة، أنا باستخدام Djangosnippets # 1031 للحصول على إدارة ContentType، لذلك الحيوان من شأنه أن وطريقة تسمية <م> as_leaf_class وترجع فئة مشتقة.

ومن الواضح، يمكن للمرء أن إنشاء نماذج لكل فئة مشتقة، ولكن هذا لا بأس به الكثير من الازدواجية غير الضرورية. (كما القوالب ستكون كل عام - أساسا {{}} form.as_p)

وبالمناسبة، فمن الأفضل أن نفترض أن الحيوانات وربما يكون واحدا من عدة فئات أساسية لا علاقة لها مع نفس المشكلة، وبالتالي فإن الحل المثالي سيكون عام.

وشكرا لكم مقدما للمساعدة.

هل كانت مفيدة؟

المحلول

حسنا، وهنا ما فعلته، وعلى ما يبدو للعمل ويكون تصميم معقولة (على الرغم من أنني أقف إلى تصحيح!).

في مكتبة الأساسية (على سبيل المثال mysite.core.views.create_update)، لقد كتبت الديكور:

from django.contrib.contenttypes.models import ContentType
from django.views.generic import create_update

def update_object_as_child(parent_model_class):
   """
   Given a base models.Model class, decorate a function to return  
   create_update.update_object, on the child class.

   e.g.
   @update_object(Animal)
   def update_object(request, object_id):
      pass

  kwargs should have an object_id defined.
  """

  def decorator(function):
      def wrapper(request, **kwargs):
          # may raise KeyError
          id = kwargs['object_id']

          parent_obj = parent_model_class.objects.get( pk=id )

          # following http://www.djangosnippets.org/snippets/1031/
          child_class = parent_obj.content_type.model_class()

          kwargs['model'] = child_class

          # rely on the generic code for testing/validation/404
          return create_update.update_object(request, **kwargs)
      return wrapper

  return decorator

وفي الحيوانات / views.py، ولدي:

from mysite.core.views.create_update import update_object_as_child

@update_object_as_child(Animal)
def edit_animal(request, object_id):
  pass

وفي الحيوانات / urls.py، ولدي:

urlpatterns += patterns('animals.views',
  url(r'^edit/(?P<object_id>\d+)$', 'edit_animal', name="edit_animal"),
)

والآن أنا فقط بحاجة إلى تحرير وظيفة فريدة لكل فئة أساسية، وهي تافهة لخلق مع الديكور.

والأمل هناك من يرى أن من المفيد، وسأكون سعيدا لردود الفعل.

نصائح أخرى

وAFAICT والقطط والكلاب على الجداول DB مختلفة، وربما ليس هناك جدول الحيوان. ولكن كنت تستخدم نمط URL واحد للجميع. في مكان ما عليك أن تختار بين كل منها.

وكنت استخدام طقطق URL مختلفة للقطط والكلاب، فإن كلا استدعاء 'create_update.update_object'. ولكن باستخدام dict مختلفة لكل منها. واحد مع 'model':Dog والآخر مع 'model':Cat

وأو ربما كنت ترغب في جدول واحد حيث كل سجل يمكن أن يكون قطة أو كلب؟ أنا لا أعتقد أنه يمكنك استخدام النماذج الموروثة لذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top