1
votes

Problème Django, valeur d'exception: la requête de correspondance d'ami n'existe pas

Je fais un projet de site Web de blog Django .

Une de mes fonctionnalités est lorsque vous vous connectez, vous pouvez cliquer sur l'onglet Autres membres pour afficher vous une liste des autres membres; comme cette image

comme sur cette image.

Cependant, à partir de maintenant, cette fonctionnalité ne fonctionne que lorsque je me connecte en tant que compte spécifique qui est un administrateur. Lorsque je me connecte en tant qu'autres membres (pas l'administrateur) ou un autre compte administrateur, la fonctionnalité ne fonctionne pas; cela signifie que lorsque je clique sur l'onglet Autres membres , des erreurs telles que

class Friend(models.Model):
    users = models.ManyToManyField(User)
    current_user = models.ForeignKey(User, related_name='owner', null=True, on_delete=models.CASCADE)

 La requête de correspondance d'ami n'existe pas.

Je suis vraiment confus et je reste bloqué sur celui-ci. Des idées pour le résoudre?

Voici mon code:

** list_users.html **

def listusers(request):
    posts = Post.objects.all().order_by()
    users = User.objects.exclude(id=request.user.id)
    friend = Friend.objects.get(current_user=request.user)
    friends = friend.users.all()

    context = {
        'posts': posts, 'users': users, 'friends': friends
    }
    return render(request, 'blog/list_users.html', context)

views.py function listusers

{% extends "blog/base.html" %}
{% block content %}
    <div class="container">
        <div class="col-sm-6">
        <h2>Other People</h2>
        {% for user in users %}
            <a href="{% url 'view_profile_with_pk' pk=user.pk %}">
                <h3>{{ user.username }}</h3>
            </a>
            {% if not user in friends %}
            <a href="{% url 'change_friends' operation='add' pk=user.pk %}">
            <button type="button" class="btn btn-success">Add Friend</button>
            </a>
            {% endif %}
        {% endfor %}
        </div>
        <br>
        <div class="col-sm-6">
        <h2>Friends</h2>
        {% for friend in friends %}
            <a href="{% url 'view_profile_with_pk' pk=friend.pk %}">
                <h3>{{ friend.username }}</h3>
            </a>
            <a href="{% url 'change_friends' operation='remove' pk=friend.pk %}">
            <button type="button" class="btn btn-default">Remove Friend</button>
            </a>
        {% endfor %}
        </div>
    </div>
{% endblock content %}

model.py classe Friend code >

"Friend matching query does not exist"


1 commentaires

Pouvez voir votre modèle ami?


3 Réponses :


1
votes

C'est parce que vous utilisez l'opérateur get pour obtenir l'ami. Le problème, comme le montre l'image que vous avez fournie, est à la ligne 25 de vos vues. dans la méthode ci-dessous:

friend = Friend.objects.filter(current_user=request.user).first()
if friend:
    friends = friend.users.all()
else: 
    friends = User.objects.none()

vous essayez d'obtenir un élément qui n'existe pas. Il n'y a aucun ami dont l'utilisateur actuel est l'utilisateur demandé.

vous pouvez résoudre le problème comme ceci:

friend = Friend.objects.get(current_user=request.user)


5 commentaires

Je suggère d'ajouter la méthode call .first () à Friend.objects.filter (current_user = request.user) pour que cela fonctionne correctement.


Merci pour votre réponse. Je le corrige comme votre réponse mais cela me donne une autre erreur AttributeError at / listusers / 'UserManager' object has no attribute 'NONE'


ce devrait être User.objects.none ()


désolé c'était une erreur


Merci ça marche maintenant. Merci à tous de m'avoir aidé à résoudre ce problème, j'apprécie vraiment.



1
votes

Essayez d'utiliser filter au lieu de get . get lève une exception lorsqu'il n'y a pas de résultat correspondant.

Jetez un œil à filter

Friend.objects.filter(current_user=request.user).first()


2 commentaires

Merci pour votre réponse. Après avoir changé friend = Friend.objects.get (current_user = request.user) en friend = Friend.objects.filter (current_user = request.user) .first () comme votre réponse, cela me donne une autre erreur: AttributeError at / listusers / L'objet 'NoneType' n'a pas d'attribut 'users'


Vous devez vérifier si l'ami n'est pas Aucun avant d'accéder aux amis.



1
votes

Une autre approche consiste à créer une instance Friend si un utilisateur n'en possède pas. Vous pouvez utiliser get_or_create pour cela. Par exemple:

users = User.objects.exclude(id=request.user.id)
friend, created = Friend.objects.get_or_create(current_user=request.user)  # or have other necessary fields for Friend field
friends = friend.users.all()

context = {
    'posts': posts, 'users': users, 'friends': friends
}
return render(request, 'blog/list_users.html', context)


0 commentaires