2 votes

django tables 2 affiche le modèle étranger comme LinkColumn

Dans Django, j'ai un modèle 'Event' qui a un champ appelé 'messplatz' (DB-Id) qui fait référence à une autre table située dans une base de données différente. Comme le champ foreignKey de Django n'est pas possible avec plusieurs bases de données, le champ 'messplatz' est un champ Integer, stockant la valeur PK de la table 'Messplatz' référencée :

class Event(models.Model):
    messplatz = models.Integerfield()

Le problème que j'ai est la représentation du modèle Event avec django-tables 2 :

Le modèle "Messplatz" est défini dans l'application "prodis", qui renvoie à une autre base de données. Ma vue se présente comme suit :

def eventList(request):
    table = EventTable(Event.objects.all())
    RequestConfig(request).configure(table)
    return render(request, 'mkv/eventList.html', {'table': table})

Dans la vue, je veux que le champ "Messplatz" affiche le nom de l'objet "Messplatz" (1). En outre, je veux qu'il soit un lien vers une autre vue (2). Je peux réaliser (1) en définissant une méthode de rendu personnalisée pour le champ 'messplatz' dans tables.py :

from prodis.models import Messplatz

class EventTable(tables.Table):

    class Meta:
        model = Event

def render_messplatz(self):
    return '%s' % Messplatz.objects.get(id=self.messplatz) 

Mais pour (2), je n'en ai aucune idée. Si je change la méthode de rendu personnalisée en

def render_messplatz(self):
    return '<a href="...">%s<a>' % Messplatz.objects.get(id=self.messplatz) 

les balises de liens sont affichées en texte brut par django-tables 2. Lorsque j'utilise la LinkColumn de django-tables, je ne peux pas non plus réaliser (1), car vous ne pouvez pas utiliser simultanément la LinkColumn et la méthode custom_render.

Quelqu'un a une idée ? Merci d'avance

0voto

tesat Points 21

J'ai réussi à le faire fonctionner. Cependant, c'est une très mauvaise solution et j'apprécierais toute autre idée.

J'ai utilisé django-tables2 Template Column :

class EventTable(tables.Table):
    #override messplatz-column
    messplatz = tables.TemplateColumn('{% load url from future %}<a href="{% url \'messplatz_events\' record.messplatz %}">{{ record.get_messplatz }}</a>')
    #Hint: {% load url from future %} is only needed for django versions < 1.5

    class Meta:
        model = Event

Pour accéder à record.get_messplatz, j'ai dû déplacer la méthode get_messplatz vers l'Event-Model :

from prodis.models import Messplatz

class Event(models.Model):
    messplatz = models.IntegerField()

    def get_messplatz(self):
        return Messplatz.objects.get(mpl_id=self.messplatz)

Je ne marquerai pas cette solution, car je pense que c'est une très mauvaise solution. Mais j'espère que cette réponse vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X