Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Récuperer le contenu d'un kwargs dans une méthode de model

0 votes

J'utilise les méthodes des modèles dans mes templates mais je souhaiterai filtrer les données récupérées. J'aimerais filtrer en fonction de l'équipe qui est dans l'url.

Je ne sais pas comment récuperer ce qui est passé en url pour l'exploiter dans une méthode de modèle.

Mon modèle:

class MyUser(AbstractBaseUser, PermissionsMixin):

username = models.CharField('username', max_length=60, blank=True)
first_name = models.CharField('first name', max_length=30)
last_name = models.CharField('last name', max_length=30)
email = models.EmailField('email address', unique=True, error_messages={
        'unique': "A user with that username already exists.",},)

objects = MyUserManager()

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name']

class Meta:
    verbose_name = 'user'
    verbose_name_plural = 'users'
    ordering = ['first_name', 'last_name']

def get_player(self, **kwargs):
    return Player.objects.filter(member = self, team = self.kwargs['team'])

def __unicode__(self):
    return self.first_name + " " + self.last_name

def __str__(self):
    return self.first_name + " " + self.last_name

Mon template:

{% extends "staff_base.html" %}
{% block title %}Salamander{% endblock %}
{% block content_title %}
<h1 class="page-header">User profil</h1>
{% endblock %}

{% block content %}
<div class="row sub-header">
  <div class = "row">

    <div class="col-xs-12 col-md-4 col-md-offset-2">
      <h2>{{ object.first_name }} {{ object.last_name }}</h2>
      <h4>Mail: <a href="mailto:{{ object.email }}">{{ object.email }}</a></h4>
      <h4>Address: {{ object.street_number }} {{ object.street }}, {{ object.zip_code }} {{ object.city }}</h4>
      <h4>Phone: {{ object.phone_number | default:"none" }}</h4>
      <h4>Born year: {{ object.birthday  | default:"none"}}</h4>

    </div>
    <div align="right" class="col-xs-2 col-md-2 col-md-offset-2" >
        {% if user_connected_username != object.username %}
        <h2><a href="{% url "add_conversation_with" team.name object.username %}">Contact</a></h2>
        {% endif %}

        {% if user_connected_username == object.username or is_admin %}
        <h4><a href="">Update</a></h2>
        {% endif %}
        {% if user_connected_username == object.username or is_admin %}
        <h4><a href="">Delete</a></h2>
        {% endif %}
    </div>
  </div>
  {% for coach in object.get_coach %}
  <div class = "row">
    <div class="col-md-8 col-md-offset-2">
  <h3>Coach in <a href="{% url "playerAndCoachInSection" team.name coach.section.name %}">{{ coach.section.name | title }}</a></h3>
  <hr>
      <div class="table-responsive">
        <table class="table table-striped">
          <thead>
            <TR style="text-align:center;">
              <TH> Grade </TH>
              <TH> Squad </TH>
              <TH> First position </TH>
              <TH> Second position </TH>
            </TR>
          </thead>
          <tbody>
            <TR>
              <TH> {{ coach.grade.acronym | upper }} </TH>
              <TD> {{ coach.squad | default_if_none:"-"  | upper }} </TD>
              <TD> {{ coach.first_position | default_if_none:"-" | upper }}</TD>
              <TD> {{ coach.second_position | default_if_none:"-" | upper }}</TD>
            </TR>
          </tbody>
        </table>
      </div>
    </div>
  </div>
  {% endfor %}

  {% for player in object.get_player %}
  <div class = "row">
    <div class="col-xs-12 col-md-8 col-md-offset-2">
      <h3>Player in <a href="{% url "playerAndCoachInSection" team.name player.section.name %}">{{ player.section.name | title }}</a></h3>
      <hr>
      <div class="table-responsive">
        <table class="table table-striped">
          <thead>
            <TR>
              <TH> #</TH>
              <TH> Position 1</TH>
              <TH> Position 2</TH>
              <TH> Weight (kg)</TH>
              <TH> Height (cm)</TH>
            </TR>
          </thead>
          <tbody>
            <TR>
              <TD>{{ player.number | default_if_none:"-" }}</TD>
              <TD>{{ player.first_position.acronym | default_if_none:"-" | upper }} </TD>
              <TD>{{ player.second_position.acronym | default_if_none:"-" | upper }} </TD>
              <TD>{{ player.weight | default_if_none:"-" | floatformat:"1" }} </TD>
              <TD>{{ player.height | default_if_none:"-" | floatformat:"1" }} </TD>
            </TR>
          </tbody>
        </table>
      </div>
    </div>
  </div>
</div>

{% endfor %}

</div>

{% endblock %}

Mon url:

    url(r'^(?P<team>.+)/profil/(?P<slug>.+)/$', login_required(UserDetailView.as_view()), name = 'view_my_member_profil'),
demandé 23-Sep-2016 par Echel8n (246 points)

1 Réponse

0 votes
 
Meilleure réponse

En fait, tu dois faire ce genre de traitement dans la vue, en utilisant les hooks prévus à cet effet :
* get_queryset(self) qui retourne les données depuis la base de données
* get_context_data(self) qui rempli le context qui sera passé au template

Pour ma part, je défini toujours des vues dans views.py (ou sous forme de package), je n'utilise quasiment jamais directement les vues "par défaut" de django, j'en hérite pour customiser mes vues.

Un autre bonne pratique est de n'utiliser les templates que pour le rendu final des données, les traitements de filtrage sont à laisser dans les vues.

Dans la vue, tu as l'attibrut self.kwargs qui contient les clés "team" et "slug", qui te donnent les infos sur les arguments passés en URL. Se sont des valeurs "brutes", tu dois les traiter pour récupérer les objets ad hoc.
Et voila...

répondu 24-Sep-2016 par frague (436 points)
sélectionné 27-Sep-2016 par Echel8n
...