我添加了联接组功能,并且效果很好。但是,现在,我试图添加休假组功能,这似乎是相似的,但它不起作用,也不会给我带来错误。这是加入和离开组的代码。应该注意的是,用户和组之间存在M2M关系。
-
(urls.py(:
from . import views from django.urls import path app_name = 'groups' urlpatterns = [ path('create/', views.create, name='create'), path('index/', views.index, name='index'), path('<int:group_id>/', views.detail, name='detail'), path('<int:group_id>/join/', views.join, name='join'), path('<int:group_id>/leave/', views.join, name='leave'), ]
-
(views.py(:
def join(request, group_id): group = get_object_or_404(Group, pk= group_id) if request.method == 'POST': group.members.add(request.user) group.save() return redirect('/groups/' + str(group_id) ) else: return render(request, '/groups/detail.html', {'group': group}) def leave(request, group_id): group = get_object_or_404(Group, pk= group_id) if request.method == 'POST': if request.user in group.members.all: group.members.remove(request.user) group.save() return redirect('home') else: return render(request, '/groups/index.html')
-
groups/detail.html
{% extends "base.html" %} {% block content %} <div class="row"> <div class="col-4"> <h1>{{group.name}}</h1> </div> <div class="col-6"> <p>{{group.description}}</p> </div> {% if user in group.members.all %} <div class="col-2"> <a href="javascript:{document.getElementById('leave').submit()}"><button class="btn btn-primary btn-lg btn-block"> Leave {{product.members.count}}</button></a> </div> {% else %} <div class="col-2"> <a href="javascript:{document.getElementById('join').submit()}"><button class="btn btn-primary btn-lg btn-block"> Join {{product.members.count}}</button></a> </div> {% endif %} </div> <div class="row"> <div class="col-4"> <img src="{{group.image.url}}" alt=""> </div> </div> <br> <br> <div class="row bootstrap snippets"> <div class="col-md-3 container-widget"> <div class="panel panel-info panel-widget"> <div class="panel-title text-center"> Group Members </div> <div class="panel-body"> {% for member in group.members.all %} <ul class="basic-list image-list"> <li><b>{{member.username}}</li> </ul> {% endfor %} </div> </div> </div> </div> <form method ='POST' id= 'leave' action="{% url 'groups:leave' group.id %}" > {% csrf_token %} <input type="hidden" > </form> <form method ='POST' id= 'join' action="{% url 'groups:join' group.id %}" > {% csrf_token %} <input type="hidden" > </form> {% endblock %}
在此处输入代码
group.members.all
是一种方法,您需要称呼它。
但不要这样做;它不必要地查询数据库中的所有成员。您可能会使用exists()
,但实际上没有理由检查。如果不存在该物品,则remove()
是一个无op。只需称呼它。
另外,修改了多到多的关系后,您不需要所有.save()
。
您的views.join
书面两次,第二个应为 views.leave
您的休假功能视图的唯一问题是,您省略了if语句的括号。如果request.user in group.members.all((:所以我认为当您添加括号时,它应该有效。
def leave(request, user_id):
if request.method == 'POST':
group = get_object_or_404(Group, pk=group_id)
if request.user in group.members.all():
group.members.remove(request.user)
group.save()
return redirect('home')
return HttpResponse("You have been removed successfully " + str(user.username))
else:
return render(request, '/groups/index.html')
我认为最好以其他方式重命名您的组模型,以避免命名与Django组模型的冲突。作为您的模型从Django模型继承,我想您做类似的事情:
class GroupExtend(models.Model):
...then your other fields etc.