#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.