0
votes

Comment utiliser deux modèles de différentes applications dans un modèle

Je veux que deux modèles de différentes applications soient rendus dans un modèle. Par exemple, dans ma page d'accueil, il existe une liste de postes montrant l'auteur post-auteur et post du contenu en conséquence. Lorsque je cliquerai sur l'étiquette de l'auteur, je souhaite afficher le profil d'auteur en haut et liste des messages de cet auteur ci-dessous. J'utilise la vue de la classe (ListView andd DétachantView). Dans mon "application des utilisateurs", j'ai un modèle de profil et dans "blog app 'j'ai un modèle postal.

blog/models.py
    class Post(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
        date_posted = models.DateTimeField(default=timezone.now)
        author = models.ForeignKey(User, on_delete=models.CASCADE)

        def __str__(self):
            return self.title

        def get_absolute_url(self):
            return reverse('post-detail', kwargs={'pk': self.pk})

users/models.py
    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        image = models.ImageField(default='default.jpg', upload_to='profile_pics')
        phone = models.CharField(max_length=10, blank=True)

        def __str__(self):
            return f'{self.user.username} Profile'

users/views.py
    class ProfileDetailView(DetailView):
        model = Profile

        # to get two model in one page
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['posts'] = Post.objects.all()
            return context
my template
    <div class="">
    <legend class="border-bottom mb-4">Profile Info</legend>
    <div class="media">
      <img class="rounded-circle account-img" src="{{ object.image.url }}">
      <div class="media-body">
        <h2 class="account-heading">{{object.user.username}}</h2>
        <p class="text-secondary">{{object.user.email}}</p>
        <p class="text-secondary">{{object.user.profile.phone}}</p>
      </div>
    </div>
</div>
<div class="">
    <legend class="border-bottom mb-4">User's Posts</legend>
        <h2 class="account-heading">{{?????}}</h2>
        <p class="text-secondary">{{??????}}</p>
</div>


urls.py
        path('profile/<int:pk>/', views.ProfileDetailView.as_view(), 
              name='profile-detail'),


2 commentaires

Bonjour, "Comment faire des requêtes pour obtenir des messages d'un utilisateur sélectionné / cliqué." - Votre question ou cette question est-elle - "Je veux que deux modèles de différentes applications soient rendus dans un modèle"?


Je veux que cette requête soit exécutée lorsque je sélectionne cet utilisateur dans un modèle différent


4 Réponses :


0
votes

Vous devez étendre votre modèle utilisateur et ajouter une méthode get_absolute_url (), qui retournera un relativement ou un chemin absolu à votre clé d'auteur à la clé étrangère pendant le poste de rendu.

Voir les documents officiels Django: https://docs.djangoproject.com/fr/ 2.2 / ref / modèles / instances / # django.db.models.model.get_absolute_url xxx


0 commentaires

0
votes

depuis v1.7 ( Voir Notes de version ) django.contrib.auth.models.abstractUser code> ne définit plus un get_absolute_url () code> méthode.

En conséquence, vous devez créer le get_absolute_url code> Méthode pour votre modèle d'utilisateur afin que vous puissiez utiliser {{user.get_aboslute_url}} code> dans vos modèles. p>

Cela peut être fait soit via un modèle utilisateur personnalisé strong> comme Dotslash227 suggère dans sa réponse , ou en ajoutant le absolu_url_overrides code > à vos paramètres strong>, qui pourrait être un peu plus simple. p>

éther façon de vous pouvez {{user.get_aboslute_url}} code> dans votre modèle (plus Comme {{chacun.author.get_absolute_url}} code> dans votre cas). p>

Pour ce dernier cas, la partie de réglage peut ressembler à quelque chose comme: P>

ABSOLUTE_URL_OVERRIDES = {
    'auth.user': lambda u: "/users/%s/" % u.username,
}


0 commentaires

0
votes

Vous pouvez accéder à l'utilisateur actuel de votre DétacherView Classe à l'aide de Self.Request.user

Par conséquent pour obtenir des messages d'utilisateur spécifiques, c'est ce que vous pourriez rechercher -

contexte ['message'] = posts.ObjectS.filter (auteur = auto.Erquest.user) Depuis que l'auteur est une clé étrangère pointant vers le modèle d'utilisateurs.

au lieu de

contexte ['message'] = post.Object.all ()

Cela devrait vous donner les messages de l'utilisateur actuel. Faites-moi savoir si vous avez besoin de clarification avec n'importe quoi.


4 commentaires

semble fonctionner. Mais maintenant, le problème est-il de retour d'article juste de l'utilisateur connecté. Par exemple, je suis un utilisateur d'un utilisateur qui affiche des messages d'un utilisateur un utilisateur, même si je sélectionne d'autres messages d'utilisateurs. Si l'utilisateur B connecté, il affiche les messages d'utilisateur B pour tous les utilisateurs


Cherchez-vous à créer un filtre utilisateur, indépendamment de l'utilisateur actuellement connecté? J'ai supposé que vous essayez d'afficher les postes d'utilisateurs actuels connectés.


Oui, je veux créer un filtre par utilisateur, quel que soit l'utilisateur actuellement connecté


merci rohit. J'ai géré mon problème. Votre réponse était un indice. Contexte ['Posts'] = post.ObjectS.filter (auteur = self.Object.user)



0
votes

Finalement j'ai eu ma réponse. Merci à tous ceux qui ont essayé de m'aider. Problème était en interrogation. Commentaire de Rohit Keshav a été une allusion à mon problème. Voici le code:

users/views.py
    class ProfileDetailView(DetailView):
        model = Profile

        # to get two model in one page
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['posts']=Post.objects.filter(author=self.object.user)
            return context


0 commentaires