django模型的方法

时间:2011-05-06 16:46:45

标签: python django methods model field

有更好的方法来处理模型中的这些函数吗?

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')

我的模型本身已经过多了。这些功能使我的模型文件几乎不可读。我有几十个。我需要那些。

我正在使用重载的contrib.admin模板重载CRM系统,因此有时更容易编写一行或两行方法,并在Admin模型的list_display =()上使用它而不是重写模板admin / change_list_result.html只是为了改变一行。

我尝试在一个类中定义模型字段,并在类中继承这些方法,但这很奇怪。

你有什么建议吗?

This is a sample model for this usecase

2 个答案:

答案 0 :(得分:5)

我不完全确定你要做什么,但这可能会有所帮助。首先,作为一般规则,您不应将格式/显示类型的信息(例如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 :(得分:1)

get_absolute_url会为你想要做的事情工作吗?您只需将锚标记卸载到模板中,然后使用get_absolute_url()方法获取URL。如果您随后使用permalink decorator,则可以将其绑定到您的网址路由中。对合同/打印/样本视图的网址的任何更改都将自动反映在整个网站中,而无需更新models.py文件以匹配新的网址结构。