python - Django2.1 : Queryset ModelChoice in a ModelForm then save two forms

标签 python django python-3.x django-forms django-2.0

我希望当前登录的用户能够创建并保存这两个表单。第二种形式具有ManyToManyField 和ForeignKey 关系,如下所示。

目前,我尝试从 ChatGroupUser ModelForm 查询当前用户。

使用当前代码,当我尝试访问该页面时,Django 会引发以下错误:

__init__() missing 1 required positional argument: 'user'

它说错误来自第 88 行,即:

form_user = ChatGroupUserForm() 

完整回溯

Traceback (most recent call last):
  File "/Users/macadmin/Documents/Django_fun4/Groupixx/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/macadmin/Documents/Django_fun4/Groupixx/lib/python3.7/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/macadmin/Documents/Django_fun4/Groupixx/lib/python3.7/site-packages/django/core/handlers/base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/macadmin/Documents/Django_fun4/Groupixx/groupixx/core/views.py", line 88, in create_group
    form_user = ChatGroupUserForm()
TypeError: __init__() missing 1 required positional argument: 'user'

模型.py

class ChatGroup(models.Model):
    name = models.CharField(max_length=100, blank=True, null=True)
    group_admin = models.ForeignKey(User, on_delete=models.CASCADE, related_name='chat_group_admins')
    is_active = models.BooleanField(default=True, null=True)
    is_current = models.BooleanField(default=False, null=True)

class ChatGroupUser(models.Model):
    user = models.ManyToManyField(User)
    chat_group = models.ForeignKey(ChatGroup, on_delete=models.CASCADE, related_name='chat_group_users')

forms.py

from django.contrib.auth import get_user_model

User = get_user_model()

class ChatGroupForm(forms.ModelForm):
    class Meta:
        model = ChatGroup
        fields = ['name',]

class ChatGroupUserForm(forms.ModelForm):
    class Meta:
        model = ChatGroupUser
        fields = ['user']

    def __init__(self, user, *args, **kwargs):
        super(ChatGroupUserForm, self).__init__(*args, **kwargs)
        self.fields['user'].queryset = User.objects.filter(user=user)

views.py

def create_group(request):
    if request.method == 'POST':
        form_group = ChatGroupForm(request.POST)
        form_user = ChatGroupUserForm(request.POST)

        if form_group.is_valid():
            create_form = form_group.save(commit=False)
            create_form.group_admin = request.user
            create_form.save()
            form_user.save(commit=False)
            form_user.user = user
            form_user.save()
            return redirect('core:group_list')

    else:
        form_group = ChatGroupForm()
        form_user = ChatGroupUserForm()

    context = {
            'form_group':form_group,
            'form_user': form_user
    }
    return render(request, 'core/create-group.html', context)

我将不胜感激任何帮助,我不确定为什么 django 会抛出错误以及为什么我无法创建和保存这两种表单。

最佳答案

这是因为你的init函数有参数user
而您的 View 未通过用户

修复方法如下
在您看来:
form_user = ChatGroupUserForm(user=request.user)

然后在您的表单中:

class ChatGroupUserForm(forms.ModelForm):
    class Meta:
        model = ChatGroupUser
        fields = ['user']

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(ChatGroupUserForm, self).__init__(*args, **kwargs)
        self.fields['user'].queryset = User.objects.filter(user=self.user)

希望它有效:)

关于python - Django2.1 : Queryset ModelChoice in a ModelForm then save two forms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57847409/

相关文章:

python - 当您只有一个核心时,是否有兴趣使用超过 1 个 worker ?

python - 在 C++ 中嵌入 Python 时我要链接到什么

python - 如何创建传递自定义半径的地理热图

python - 无法返回我想要的列表

python - 如何根据数据框中的类别高效构建 ngram

python - 如何按月从数据库组中检索数据并在 Django 中的某个月份没有值时返回零?

html - 为什么将 Bootstrap 按钮放入 DIV 后会停止工作?

python - 在 Python 中访问 Flatbuffers 联合

python - 将字符串封闭列表转换为列表

django - 在生产中使用 Django 中的 SQLite?