методы модели django

#python #django #methods #model #field

#python #django #методы #Модель #поле

Вопрос:

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

 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 только для того, чтобы изменить одну строку.

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

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

Это пример модели для этого случая использования

Комментарии:

1. Что вы имеете в виду, когда говорите «те»?

Ответ №1:

Я не совсем уверен, что вы пытаетесь сделать, но это может быть полезно. Во-первых, как общее правило, вы не должны помещать форматирование / тип отображения информации (такой как 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>
  

Комментарии:

1. @Alex, да, но это не было основано на том, что ты сказал. 🙂 Я подозреваю, что мы начали отвечать одновременно, просто мне потребовалось больше времени, чтобы ввести форматированный код. 🙂

2. @ John C, да, вот почему я улучшил твой ответ. У вас был код, у меня его не было 🙂

3. Посмотрите на мой пример кода (ссылка в вопросе) и проверьте этот вариант использования: list_display = ( 'season', 'uid_decorator', 'customer_decorator', 'comment2_decorator', 'group_decorator', 'day_decorator', 'type_decorator', 'comment_decorator', 'signup_date', 'resignation_date' )

Ответ №2:

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