On Thu, Sep 23, 2010 at 5:55 PM, Klaas van Schelven
<klaasvanschel...@gmail.com> wrote:
> On Sep 23, 2:01 am, Russell Keith-Magee <russ...@keith-magee.com>
> wrote:
>
> So, we run into a few problems:
> * How do we extend the models from the original extendible
> application?
> For this to work, we need to provide hooks in the application for
> extendiblity. In the case of models, such a hook would be twofold:
> 1. an abstract model to extend to provide a baseline (a default with
> the minimum amount of fields)
> 2. something overridable that is referred to by the rest of our app,
> providing the concrete instance of [1] in the plain vanilla app, and
> the concrete instance plus extensions in our extended app. (the actual
> hook)

Sure. Abstract models form the first part of this; the 'reference to
the concrete instance' is a known problem -- the most obvious example
of this surfacing is defining a custom User class to use in
contrib.auth. Alex provides one possible solution (join models) in his
talk; another (LazyForeignKey) was raised by Eric Florenzano in his
keynote [1]. However, this is still very much an open area of debate.
Any suggestions are welcome.

[1] http://djangocon.blip.tv/file/4112452/

> * how do we refer to ourselves from the various parts of the
> extendible application?
> Self-referral with overrides is a solved problem in the object
> oriented world ("inheritance"). However, it's impossible in Django's
> standard way of organizing apps, because we all use modules (not
> classes or instances) for the various parts of the app ("models.py",
> "views.py" etc).
> It is not possible to pass context into a module (other than monkey
> patching it)
>
> Every views.py begins with a bunch of imports from the associated
> models.py, tying the views into those particular app's models. My
> alternative would be like so:
>
> class View(...):
>  def page_detail(self, request, pk=None):
>    page = self.models.Page.objects.get(pk=pk)
>    return render_to_response(.... page ...)
>
> For models:
>
> class Models(...):
>  def get_Page(self):
>    class Page(models.Model):
>       #abstract
>       category = models.ForeignKey(self.models.Category)
>    return Page
>  Page = property(get_Page)
>
> (The above is a bit less elegant than the views example because models
> are classes and the following therefor does not work:)
>
> class Models(...)
>  class Page(self, model.Model):
>     ...
>     category = models.ForeignKey(self.models.Category)
>
> If anyone has an example of how to do this without a property I'd be
> much obliged.

Sure. There's at least two approaches. The first -- a method based
approach -- is used by contrib.auth (amongst others):

def my_view(request, arg1, arg2, klass=Page):
    objects = klass.objects.filter(arg1=arg1, arg2=arg2)
    ...

The second is the class based approach, used by contrib.admin (and
others), which is to define a class-based view, and provide methods
like get_objects() that you can subclass to perform whatever behaviour
you need.

> Views.py methods generally have two types of parameters:
> 1. Those that are passed in via urls.py from the request path. Love
> 'em, couldn't live without 'em. This is what you're talking about.
> 2. Those we add (with usefull defaults) to make our app "reusable".
> What I was saying, is that I consider these in particular as unusable
> in the general sense. If I subclass the idea of address in an address
> book app (to add some field), would it make sense to refer to the
> subclassed address class in every call to every single view function?
> I'd say no. I'd rather say "give me my views where each view
> understands that it should use the improved address class).

Sure. And that's why you use class-based views. That's why Django's
admin is a class.

That's also why Django is in the process of getting a class-based view
framework - again, from DjangoCon, see Ben Firshman's talk [2]

[2] http://blip.tv/file/4109272

Yours,
Russ Magee %-)

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to