2011-06-17 5 views
0

Voici le contexte: J'ai utilisateurs, vidéos, thèmes, critères et évaluationsDjango - Cote modèle Exemple DetailView Modèle

  • Une vidéo a un sujet
  • Un sujet a critères
  • Un utilisateur peut créer une vidéo pour un sujet donné
  • Un utilisateur peut évaluer une vidéo sur les critères donnés pour le sujet concerné.

Voici mon modèle à cette fin:

RATE_CHOICES = zip(range(1,5), range(1,5)) 

class VideoCrit(models.Model): 
    """Criteria to rate videos on. 
    Can be multiple for each Topic of Video""" 
    name = models.CharField(max_length=50) 
    def __unicode__(self): 
    return self.name 
    class Meta: 
    verbose_name = 'Video Criteria' 

class VideoTopic(models.Model): 
    name = models.CharField(max_length=50) 
    descr = models.TextField(blank=True, null=True) 
    crits = models.ManyToManyField(VideoCrit, 
    help_text='Criterias to rate the videos', 
    blank=True, null=True, 
) 
    def __unicode__(self): 
    return self.name 
    class Meta: 
    verbose_name = 'Video Topic' 

class VideoFile(models.Model): 
    """Uploadable by users to be rated and commented""" 
    name = models.CharField(max_length=50) 
    descr = models.TextField(blank=True, null=True) 
    file = models.FileField(upload_to='videos') 
    topic = models.ForeignKey(VideoTopic) 
    def __unicode__(self): 
    return self.name 
    class Meta: 
    verbose_name = 'Chatter Tube' 

class VideoRate(models.Model): 
    """Users can Rate each Video on the criterias defined for the topic""" 
    user = models.ForeignKey(User) 
    video = models.ForeignKey(VideoFile) 
    crit = models.ForeignKey(VideoCrit) 
    rate = models.DecimalField(max_digits=2, decimal_places=1, choices=RATE_CHOICES) 
    class Meta: 
    unique_together = (('user', 'video', 'crit'),) 
    verbose_name = 'Tube Rating' 

Est-il ok?

Si oui, à partir d'un modèle (DetailView basé sur la classe videofile) pour une donnée videofile, voici la partie intéressante du modèle

<div id="rating"> 
    <ul> 
    {% for crit in videofile.topic.crits.all %} 
     <li> 
     <div class="rateit" 
      crit-id="{{ crit.id }}"></div> 
     {{ crit.name }} 
     </li> 
    {% endfor %} 
    </ul> 
    </div> 

URLConf & Voir

#urlconf 
#... 
    (r'viewtube/(?P<pk>\d+)$', VideoFileDetailView.as_view()), 
#... 

#view 
class VideoFileDetailView(DetailView): 
    model = VideoFile 
    def get_context_data(self, **kwargs): 
    context = super(VideoFileDetailView, self).get_context_data(**kwargs) 
# context['rates'] = VideoRate.objects.filter(video=11) 
    return context 

Comment J'ai accès aux évaluations de l'utilisateur actuellement connecté pour la vidéo en cours?

+0

Ca me va, ça marche? – dotty

+0

Question mise à jour –

Répondre

1

MISE À JOUR: Pour obtenir toutes les évaluations pour l'utilisateur actuellement connecté pour la vidéo en cours

# in Views.py 

video = VideoFile.objects.get(pk=video_id) #video_id is parameter sent from url 
user_ratings = VideoRate.objects.filter(user=request.user).filter(video=video) 

# in template 
<ul> 
{% for rating in user_ratings %} 
    <li>{{ rating.crit.name }}: {{ rating.rate }}</li> 
{% endfor %} 
</ul> 

DÉJÀ:

Vous devriez pouvoir accéder aux notes de l'utilisateur connecté en utilisant quelque chose cet effet:

user.videorate_set.all 

Vous pouvez alors afficher toutes les cotes pour un utilisateur donné dans votre modèle comme suit:

{% for rating in user.videorate_set.all %} 
    {{ rating.video }} {{ ratings.rate }} 
{% endfor %} 
+0

Désolé, j'ai mis à jour ma question. J'aimerais voir les notes de l'utilisateur actuel pour la vidéo en cours. –

+0

@Glide je vois. Si vous souhaitez que les notes d'une seule vidéo ne concernent que l'utilisateur actuellement connecté, il est probablement préférable d'afficher ces valeurs dans votre vue, puis de les transmettre en tant que variables à votre modèle. pouvez-vous poster vos autres modèles, en particulier comment vous connectez votre modèle d'utilisateur avec vos autres modèles, et aussi votre code d'affichage? vous pouvez également écrire un tag de modèle personnalisé, mais cela semble être exagéré. –

+0

Question mise à jour –

0

Django - Generic View Subclassed - url Parameters m'a donné la réponse. Je dois ajouter les tarifs pré filtrés au contexte du modèle.

class VideoFileDetailView(DetailView): 
    model = VideoFile 

    def get_context_data(self, **kwargs): 
    context = super(VideoFileDetailView, self).get_context_data(**kwargs) 
    context['rates'] = VideoRate.objects.filter(video=self.object, user=self.request.user) 
    return context