методы модели Джанго

есть ли лучший способ справиться с этими функциями внутри модели?

class MyModel ( models.Model ):
    name = models.CharField( max_length=50 )
    foo = models.CharField( max_length=50 )

    def style_foo():
        return '<a href="/contract/print/sample/%s/">%s</a>' % ( self.pk, _( 'View sample' ) )

    style_foo.allow_tags = True
    style_foo.short_description = _('Style sample')

У меня сильно перегружена сама модель. Эти функции делают мой файл модели практически нечитаемым. У меня их десятки. Мне нужны те.

Я делаю CRM-систему с большой перегрузкой шаблонов contrib.admin, поэтому иногда проще написать одно-двухстрочный метод и использовать его на админке модели list_display=(), а не переписывать шаблон admin/change_list_result.html только для того, чтобы изменить одну строку.

Я пытался определить поля модели в одном классе и наследовать в классе с помощью этих методов, но это довольно странно.

У Вас есть какие-то предложения?

Это образец модели. для этого варианта использования


person Matt Harasymczuk    schedule 06.05.2011    source источник
comment
Что вы имеете в виду, когда говорите «те»?   -  person NT3RP    schedule 06.05.2011


Ответы (2)


Я не совсем уверен, что вы пытаетесь сделать, но это может быть полезно. Во-первых, как правило, вы не должны размещать информацию о типе форматирования/отображения (например, HTML) на уровне модели. Вы должны отформатировать HTML в другом месте и спроектировать модель так, чтобы она возвращала URL-адрес для любого заданного объекта. Например:

# views.py
from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=50)

    @models.permalink
    def get_absolute_url(self):
        return ('view-sample', [self.pk])

# urls.py
from myapps.models import view_sample
urlpatterns = patterns('',
    url(r'^contract/print/sample/(?P<sample>.*)/$', view_sample, name='view-sample'),

# view_template.html
<p><a href="{{ anySample.get_absolute_url }}">Click to view sample</a></p>
person John C    schedule 06.05.2011
comment
@ Алекс, да, но это не было основано на том, что ты сказал. :) Я подозреваю, что мы начали отвечать одновременно, просто мне потребовалось больше времени, чтобы набрать форматированный код. :) - person John C; 06.05.2011
comment
@ John C, да, вот почему я повысил твой ответ. У тебя был код, у меня нет :) - person Alex Jillard; 06.05.2011
comment
Посмотрите на мой пример кода (ссылка в вопросе) и проверьте этот вариант использования: list_display = ( 'season', 'uid_decorator', 'customer_decorator', 'comment2_decorator', 'group_decorator', 'day_decorator', 'type_decorator', 'comment_decorator', 'signup_date', 'resignation_date' ) - person Matt Harasymczuk; 29.05.2011

Будет ли get_absolute_url работать для что ты пытаешься сделать? Вы просто выгружаете тег привязки в свой шаблон и используете метод get_absolute_url() для получения URL-адреса. Если вы затем используете постоянную ссылку decorator, вы можете привязать его прямо к маршрутизации URL-адресов. Любые изменения ваших URL-адресов для просмотра контракта/печати/образца будут автоматически отражены на вашем сайте без необходимости обновлять файл models.py, чтобы он соответствовал новой структуре URL-адреса.

person Alex Jillard    schedule 06.05.2011