我正在尝试创建一个收藏夹功能,用户可以将其他用户添加为收藏夹。在显示用户配置文件的视图中,我有一个按钮,可以添加用户或删除已添加的用户。问题是,我无法将添加为收藏夹的用户传递到视图。
models.py
class User(AbstractUser):
is_type1 = models.BooleanField(default=False)
...
class Type1(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
favorite = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, related_name='favorite')
views.py
def FavoriteView(request, pk):
current_user = request.user
Type1.user = current_user.id
buser = Type1.user
Type1.favorite = get_object_or_404(User, id=request.POST.get('username')) # The of the error where I try to add the user being added as a favorite
fuser = Type1.favorite
if Type1.favorite.filter(id=request.user.id).exists():
Type1.favorite.remove(request.user)
else:
Type1.favorite.add(request.user)
return HttpResponseRedirect(reverse('profile-details', kwargs={'username': Type1.favorite}))
class UserView(DetailView):
model = User
...
template_name = 'users/profile-details.html'
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
favorite_connected = get_object_or_404(Type1.favorite, id=self.kwargs['username']) # The of the error where I try to add the user being added as a favorite
favorite = False
if favorite_connected.favorite.filter(id=self.request.user.id).exists():
liked = True
data['user_is_favorite'] = favorite
return data
profile-details.html
...
{% if user.is_authenticated %}
<form action="{% url 'favorite' object.id %}" method="POST">
{% csrf_token %}
{% if user_is_favorite %}
<button type="submit" name="favorite" value="{{object.id}}">Not favorite</button>
{% else %}
<button type="submit" name="favorite" value="{{object.id}}">Favorite</button>
{% endif %}
</form>
{% else %}
<a href="{% url 'login' %}?next={{request.path}}">Log in to add user to favorites.</a><br>
{% endif %}
urls.py
path('profile/<str:username>/', UserView.as_view(), name='profile-details'),
path('favorite/<str:username>/', FavoriteView, name="favorite"),
1条答案
按热度按时间ulydmbyx1#
我看到的一个直接问题是,URL路径需要一个字符串作为用户名,但表单的URL却给出了用户的ID,因此这将是一个
int
。就你的错误而言,你试图传递一个用户名,但我不认为它会出现在POST数据中。
get_object_or_404(User, username=request.POST.get('username'))
然而,根据我最初的评论,你可能应该像你正在做的那样通过ID获得用户,但是使用你的视图附带的用户的PK;
get_object_or_404(User, id=pk)
你也可能会遇到更多的错误,因为你分配一个对象,如果它存在到
Type1.favorite
,然后试图做Type1.favorite.filter(
,这将失败。你只能在一个queryset上,而不是一个模型示例上执行.filter()
。