Django模型的方法

0 投票
2 回答
1592 浏览
提问于 2025-04-16 17:08

有没有更好的方法来处理模型中的那些函数呢?

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)系统,使用了很多复杂的管理模板,所以有时候写一两行简单的方法会更方便,这样我就可以在管理模型的列表显示中用上,而不需要为了改一行而重写整个模板 admin/change_list_result.html。

我试着在一个类中定义模型字段,然后在另一个类中继承这些方法,但这样做感觉有点奇怪。

你有什么建议吗?

这是一个适合这个情况的模型示例

2 个回答

1

你想做的事情可以用 get_absolute_url 来实现吗?你只需要把链接的部分放到你的模板里,然后用 get_absolute_url() 方法来获取网址。如果你再使用 permalink 装饰器,就可以把它直接和你的网址路由连接起来。这样一来,任何关于合同、打印或样本视图的网址更改都会自动在你的网站上反映出来,而不需要去更新 models.py 文件来适应新的网址结构。

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>

撰写回答