Django:加入一个小组工作,但我不能离开小组



我添加了联接组功能,并且效果很好。但是,现在,我试图添加休假组功能,这似乎是相似的,但它不起作用,也不会给我带来错误。这是加入和离开组的代码。应该注意的是,用户和组之间存在M2M关系。

  1. (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'),
    ]
    
  2. (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')
    
  3. 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.

最新更新