2011-05-06 3 views
0

Y a-t-il une meilleure façon de gérer ces fonctions à l'intérieur du modèle?Méthodes du modèle 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') 

J'ai un modèle assez surchargé. Ces fonctions rendent mon fichier de modèle à peine illisible. J'en ai des dizaines. J'ai besoin de ceux-là.

Je suis en train de créer un système CRM avec une surchargée de templates contrib.admin, donc il est parfois plus facile d'écrire une méthode à une ou deux lignes et de l'utiliser sur list_display =(). html seulement pour changer une ligne.

J'ai essayé de définir des champs de modèle dans une classe et j'ai hérité en classe avec ces méthodes, mais c'est assez étrange.

Avez-vous des suggestions?

This is a sample model for this usecase

+0

Que voulez-vous dire quand vous dites «ceux»? – NT3RP

Répondre

1

Would get_absolute_url travail pour ce que vous essayez de faire? Vous venez de décharger la balise d'ancrage dans votre modèle et utilisez la méthode get_absolute_url() pour obtenir l'URL. Si vous utilisez ensuite le permalink decorator, vous pouvez l'attacher directement à votre routage d'URL. Toute modification apportée à vos URL pour la vue contrat/impression/exemple sera automatiquement répercutée sur votre site sans devoir mettre à jour votre fichier models.py pour correspondre à la nouvelle structure d'URL.

5

Je ne suis pas entièrement sûr de ce que vous essayez de faire, mais cela pourrait être utile. Tout d'abord, en règle générale, vous ne devez pas mettre en forme/afficher le type d'informations (telles que HTML) dans le niveau du modèle. Vous devez formater le code HTML ailleurs et concevoir le modèle afin de renvoyer une URL pour un objet donné. Par exemple:

# 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> 
+0

+1 c'est ce que j'ai dit, mais avec les exemples de code ajoutés. –

+0

@Alex, oui, mais ce n'était pas basé sur ce que vous avez dit. :) Je suppose que nous avons commencé à répondre en même temps, cela m'a pris plus de temps pour taper du code formaté. :) –

+0

@ John C, Yup, c'est pourquoi j'ai augmenté votre réponse. Vous avez du code, je n'ai pas :) –

Questions connexes