【问题标题】:Django forms - Allow a user to create a group for other usersDjango 表单 - 允许用户为其他用户创建组
【发布时间】:2021-01-12 20:11:15
【问题描述】:

我试图让用户创建一个“俱乐部”(基本上是一个组),用户以后可以在其中添加用户。

目前它不会以某种方式在数据库中创建字段。

任何建议都将不胜感激,因为我对表单相当陌生。

型号

class Club(models.Model):
    owner = models.CharField(max_length=30)
    topic = models.CharField(max_length=30)
    start = models.DateTimeField(verbose_name='start date', auto_now_add=False)
    end = models.DateTimeField(verbose_name='end date', auto_now_add=False)
    account = models.ManyToManyField(Account)

观看次数

@login_required
def add_club(request):

    if request.method == "POST":

        form = AddClubForm(request.POST, instance=request.user)
        print(form)

        if form.is_valid():
            form.save()

        return HttpResponseRedirect(request.path_info)

    else:
        form = AddClubForm(instance=request.user)

    return render(request, 'page/club.html', {
        "form": form,
    })

表格

class AddClubForm(forms.Model):
    
    owner = forms.CharField(required=True)
    topic = forms.CharField(required=False)
    start = forms.DateField(required=False)
    end = forms.DateField(required=False)

    class Meta:
        model = Club
        fields = (
            'owner',
            'topic',
            'start',
            'end',
        )

模板

<form method="POST" action="">
    {% csrf_token %}
    <div class="col-md-6">
        <label class="labels">Create a club</label>
        {{ form.owner }}
        <input class="btn" type="submit" value="Add club">
    </div>
</form>

【问题讨论】:

  • 您好,您没有任何错误信息吗?你为什么将 request.user 作为一个实例传递给你的表单(它应该是一个 Club 实例)?在您的模板中,{{ form.owner }} 而不仅仅是 {{ form.}} 的任何原因?此外,您的 Account M2M 关系不是 blank=True,因此它在创建实例时需要它。
  • 嗨 Brise,没有错误消息。我将用户作为实例传递,因为我必须检查他们是否经过身份验证。在我的模板中,我使用{{ form.owner }},因为我最终会添加更多字段,例如form.topic 等。关于blank=True 的好点,但数据库中仍然没有。
  • 我对 form.owner 不利,没有看到其他字段被标记为 required=False。然后在这些字段的模型中也需要blank=True, null=True。我仍然没有得到instance=request.user,因为实例需要是一个俱乐部对象,并且您的视图已经需要用户通过包装器@login_required 登录。您的意思是您希望自动将 request.user 设置为已创建俱乐部的所有者?
  • 感谢您的blank=Truenull=True 解决了这个问题。非常感谢您的意见。谈到instance=request.user,你说得对,我可以删除它。但是,您不能将表单作为实例传递。
  • 我在下面发布了答案。你介意验证一下吗?我也尝试解释这个实例,因为它是 Django 的 ModelForms 的一个非常重要的特性。

标签: django django-models django-views django-forms


【解决方案1】:

既然这回答了你的问题,我在这里发布解决方案:

您需要将blank=True, null=True 添加到模型中的字段中,否则在保存表单时需要它们。

class Club(models.Model):
    owner = models.CharField(max_length=30)
    topic = models.CharField(max_length=30, blank=True, null=True)
    start = models.DateTimeField(verbose_name='start date', auto_now_add=False, blank=True, null=True)
    end = models.DateTimeField(verbose_name='end date', auto_now_add=False, blank=True, null=True)
    account = models.ManyToManyField(Account, blank=True)

关于instance=request.user,相信你误解了ModelForm中实例的使用。

如果请求方法是 GET,则该实例用于使用现有 Club 对象中的数据填充 ModelForm,然后将其传递给您的模板以显示信息。 如果请求方法是 POST(或 PUT),则实例表示您想要使用从表单接收到的数据更新的现有 Club 对象。

您通常需要在 DetailView 中使用实例 arg(更新或检索一个特定的俱乐部),而在创建对象时从不。

这就是为什么你需要在你的views.py中删除实例arg:

form = AddClubForm(request.POST)

【讨论】:

  • 在我看来,我从form = AddClubForm(request.POST, instance=request.user) 中删除了instance=request.user。感谢您的解释,我想我会尝试“玩”它以便我理解它。
  • 是的,解释了,但忘了重点^^。感谢您提醒我,我编辑了我的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 2019-02-24
  • 2020-11-14
相关资源
最近更新 更多