Django: Profile?
Django/Python Error: Profile matching query does not exist.
Ich programmiere eine Website auf der man Benutzern folgen kann und deren Beiträge sehen kann im feed.html.
Ich habe kleine änderungen vorgenommen die aufeinmal im feed.html einen error anzeigen.
Ich bin meine Spuren wieder zurück gegangen und kann echt nicht verstehen wie das passieren konnte. Ich habe bei forms.py den block "Media" rausgenommen da dieser code nicht geklappt hat. In dem Code geht es darum das man anstatt Text auch bilder posten kann, hat leider nicht geklappt.
Naja. Als ich diesen block wieder entfernt habe kam dieser error, ich weiß nicht wie ich das fixen kann.
ich poste mal meine seiten.
views.py
from blog.models import Post
from notification.models import Notification
from django.core.checks import messages
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.contrib.auth.models import User
from django.urls import reverse_lazy, reverse
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from .models import Comment, Post
from .forms import CommentForm
from django.http import HttpResponseRedirect, JsonResponse
from users.models import Profile
from itertools import chain
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.template.loader import render_to_string
import random
""" Home page with all posts """
def first(request):
context = {
'posts':Post.objects.all()
}
return render(request, 'blog/first.html', context)
""" Posts of following user profiles """
@login_required
def posts_of_following_profiles(request):
profile = Profile.objects.get(user = request.user)
users = [user for user in profile.following.all()]
posts = []
qs = None
for u in users:
p = Profile.objects.get(user=u)
p_posts = p.user.post_set.all()
posts.append(p_posts)
my_posts = profile.profile_posts()
posts.append(my_posts)
if len(posts)>0:
qs = sorted(chain(*posts), reverse=True, key=lambda obj:obj.date_posted)
paginator = Paginator(qs, 5)
page = request.GET.get('page')
try:
posts_list = paginator.page(page)
except PageNotAnInteger:
posts_list = paginator.page(1)
except EmptyPage:
posts_list = paginator.page(paginator.num_pages)
return render(request,'blog/feeds.html',{'profile':profile,'posts':posts_list})
forms.py
from django import forms
from django.forms import fields, widgets
from .models import Post, Comment
class CommentForm(forms.ModelForm):
body = forms.CharField(widget=forms.Textarea(attrs={'class':'form-control custom-txt','cols':'40','rows':'3'}), label='')
class Meta:
model = Comment
fields = ['body',]
die seiten sind nicht vollständig, hab die unnötigen sachen rausgelassen.
2 Antworten
users = [user for user in profile.following.all()]
[...]
for u in users:
Das kannst Du genauso gut als
for u in profile.following.all():
Ich weiß ja nicht, was following.all() zurückliefert, aber damit die Comprehension überhaupt einen Sinn hat, müßtest Du schon filtern oder zumindest die einzelnen Items irgendwie transformieren.
Und wie regex9 sagt:
Fang die Exception und schreibe Dir ein Debug Log oder ähnliches.
Der Fehlermeldung zufolge wird hier:
p = Profile.objects.get(user=u)
der übergebene Nutzer in der Datenbank nicht gefunden. Es wäre wohl sinnvoll (via Logging) zu schauen, welche konkreten Werte zur Laufzeit übergeben werden.
Den Fehler selbst könntest du via try-except abfangen:
try:
p = Profile.objects.get(user=u)
# ...
except Profile.DoesNotExist:
# maybe write a log ...
Die profile.following.all-Methode liefert doch sicherlich je Nutzer unterschiedliche Objekte zurück.
wo muss ich den code den du mir empfohlen hast einfügen?
Belies dich am besten erst zu try-except (bspw. hier), dann sollte es klar sein.
das werde ich jetzt versuchen, aber mir ist gerade aufgefallen das der benutzer mit dem ich eingeloggt war nur diese fehlermeldung angezeigt hat. mit einem anderen beutzer war das problem nicht mehr da, woran könnte das liegen?