从列表中选择用户并添加到发布请求

Posted

技术标签:

【中文标题】从列表中选择用户并添加到发布请求【英文标题】:Select users from list and add to post request 【发布时间】:2020-01-11 06:58:17 【问题描述】:

我有一个用户列表,他们旁边都有一个复选框。所有被选中的用户都应该被添加到数组中,然后通过 Django 的 post 请求发送到数据库。

这是一张照片:

底部的按钮是提交按钮。

型号:

class UserProfile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    color = models.CharField(max_length=25, default="", blank=True)

class Studyplan(models.Model):
    name = models.CharField(max_length=100, null=True)
    description = models.CharField(max_length=1000, null=True)
    parent_assignment = models.ForeignKey(Assignment, blank=True, on_delete=models.CASCADE,related_name="studyplan", null=True)
    deadline = models.DateField(default=date.today, null=True)
    students = models.ManyToManyField(UserProfile, blank=True, related_name="studyplan_students", null=True)
    teachers = models.ManyToManyField(UserProfile, blank=True, related_name="studyplan_teachers", null=True)
    canview = models.ManyToManyField(UserProfile, blank=True, related_name="studyplan_canview", null=True)
    notes = models.ManyToManyField(Note, blank=True, related_name="studyplan", null=True)
    tasks = models.ManyToManyField(Task, blank=True, related_name="studyplan", null=True)
    messages = models.ManyToManyField(Message, blank=True, related_name="studyplan", null=True)

观看次数:

@login_required
def skapa_studieplan(request):
    if request.method == 'POST':

        name = request.POST.get('Studyplan-Name')
        description = request.POST.get('Studyplan-Description') 
        parent_assignment = Assignment.objects.get(pk=request.POST.get('Studyplan-PAID'))
        users = UserProfile.objects.all()
        instance = Studyplan.objects.create(request.POST.get('Studyplan-Canview'))
        for user in users:
            instance.canview.add(user)

        studyplan = Studyplan(name=name, description=description, parent_assignment=parent_assignment, canview=instance)
        studyplan.save()

        return redirect('allaStudieplaner')

我的问题是我无法将 ManyToManyField 中的值放入 POST 请求中。

我收到与此类似的错误:禁止直接分配到多对多集合的前端。请改用 emails_for_help.set()

选择模式:

% for elev in elever %
                        <div class="custom-control custom-checkbox">

                            <span class="d-flex align-items-center">


                                <div style="margin-right: 10px">
                                    <div class="circle" style="background-color:  elev.color ">
                                        <span class="initials" , style="color: #ffffff">  elev.user|capfirst|first 
                                        </span>
                                      </div>
                                </div>

                              <div style="width: 300px">

                                <span class="h6 mb-0" data-filter-by="text">elev.user|capfirst</span>
                              </div>
                              <div class="checkboxx"> <input type="checkbox" name="Studyplan-Canview" value= " student.name ">
                                <style>
                                .checkerName 
                                  margin-left: 10px
                                

                                .checkboxx 
                                  align-content: flex-end;
                                  margin-left: 300px
                                
                                </style> </div>

                            </span>
                          </label>
                        </div>
                        % endfor %

整个 html

【问题讨论】:

您能否删除您的 HTML 图片,然后将选择小部件粘贴到选择用户的位置?其余的都无关紧要。而且你能告诉使用你要问的领域吗?您的模型中有许多 ManyToMany 字段,我们不知道您尝试将哪一个分配给在 HTML 表单中选择的用户。 http.post 中的 canview 字段,我想要一个我选择的所有用户输入的数组。我将粘贴选择小部件! 那么,如果您查看浏览器开发工具、网络选项卡,您的 POST 请求是什么样的?查看提交的值。还要在调试器中查看request.POST 正如错误所说,您不能将值直接分配给 M2M 字段,您必须使用 set()add()。请阅读并练习 this 以了解如何使用 M2M 关系。 我都尝试了好几个小时,你能举个例子吗? 【参考方案1】:

假设您的 request.POST 包含密钥 canview 的用户名列表,您将获得如下用户名列表:usernames = request.POST.getlist('canview')

现在,使用用户名列表,您需要获取相应的用户并使用 set() 将这些用户分配给您的 M2M 字段:

usernames = request.POST.getlist('canview')
users = User.objects.filter(username__in=usernames)
studyplan = Studyplan(name=name, description=description, parent_assignment=parent_assignment)
studyplan.save()  # you need a saved item to be able to create the M2M relationship
studyplan.canview.set(users)

【讨论】:

以上是关于从列表中选择用户并添加到发布请求的主要内容,如果未能解决你的问题,请参考以下文章

选择添加到 SwiftUI 列表的新项目

iPad 目录应用程序

从下拉列表中选择选项并使用 nodejs 提交请求

CircleImage 在选择器中选择一个选项并添加到列表后不断改变颜色

从下拉列表中选择并在颤动中同时更新相同的列表

Spotify API 发布请求将曲目添加到播放列表 - 错误 400 错误请求