如何使用 django ModelForm 为请求的用户提供初始值并在 django admin 中分配表单
How to provide requested user in initial values with django ModelForm and assign the form in django admin
我想在不选择我的用户作为作者的情况下使用 ModelForm 和通用 CreateView 创建文章。作者应该是请求的用户。
我知道它可以通过多种方式解决,但我想用一种我可以在任何地方使用的形式(django-admin 和视图)来解决它。
到目前为止,我试过这个:
models.py
class Article(TimeStampedModel):
...
author = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
content = RichTextUploadingField(config_name='default')
status = models.CharField(max_length=10,
choices=STATUS_CHOICES,
default='draft')
...
forms.py
class ArticleCreateForm(forms.ModelForm):
class Meta:
model = Article
fields = [
'title', 'featured_image', 'content', 'status'
]
author = forms.IntegerField(widget=forms.HiddenInput)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
user_field = kwargs.get('instance')
self.fields['author'].initial = user_field.id
views.py
class ArticleCreate(CreateView):
form_class = ArticleCreateForm
template_name = 'articles/article_form.html'
def get(self, request, *args, **kwargs):
form = self.form_class(instance=request.user)
return render(request, self.template_name, {'form': form})
def form_valid(self, form):
return super().form_valid(form)
def form_invalid(self, form):
return HttpResponse(str(form.errors))
它呈现表单,但没有保存文章,而是抛出此错误:
File "/home/tareq/Desktop/PERSONAL/Blog/blog/blog/articles/forms.py", line 19, in __init__
self.fields['author'].initial = user_field.id
AttributeError: 'NoneType' object has no attribute 'id'
ERROR 2021-01-23 00:58:31,533 log 85374 140159710901824 Internal Server Error: /new/
Traceback (most recent call last):
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/tareq/.pyenv/versions/3.8.0/lib/python3.8/contextlib.py", line 75, in inner
return func(*args, **kwds)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/views/generic/base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/views/generic/edit.py", line 172, in post
return super().post(request, *args, **kwargs)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/views/generic/edit.py", line 140, in post
form = self.get_form()
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/views/generic/edit.py", line 33, in get_form
return form_class(**self.get_form_kwargs())
File "/home/tareq/Desktop/PERSONAL/Blog/blog/blog/articles/forms.py", line 19, in __init__
self.fields['author'].initial = user_field.id
AttributeError: 'NoneType' object has no attribute 'id'
您似乎缺少在用户提交表单时实际获取用户 ID 的逻辑。如果您查看此文档,您将看到您需要引用请求对象以获取用户信息并将视图逻辑分配 request.user_id 给新实例。
我想在不选择我的用户作为作者的情况下使用 ModelForm 和通用 CreateView 创建文章。作者应该是请求的用户。 我知道它可以通过多种方式解决,但我想用一种我可以在任何地方使用的形式(django-admin 和视图)来解决它。
到目前为止,我试过这个:
models.py
class Article(TimeStampedModel):
...
author = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
content = RichTextUploadingField(config_name='default')
status = models.CharField(max_length=10,
choices=STATUS_CHOICES,
default='draft')
...
forms.py
class ArticleCreateForm(forms.ModelForm):
class Meta:
model = Article
fields = [
'title', 'featured_image', 'content', 'status'
]
author = forms.IntegerField(widget=forms.HiddenInput)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
user_field = kwargs.get('instance')
self.fields['author'].initial = user_field.id
views.py
class ArticleCreate(CreateView):
form_class = ArticleCreateForm
template_name = 'articles/article_form.html'
def get(self, request, *args, **kwargs):
form = self.form_class(instance=request.user)
return render(request, self.template_name, {'form': form})
def form_valid(self, form):
return super().form_valid(form)
def form_invalid(self, form):
return HttpResponse(str(form.errors))
它呈现表单,但没有保存文章,而是抛出此错误:
File "/home/tareq/Desktop/PERSONAL/Blog/blog/blog/articles/forms.py", line 19, in __init__
self.fields['author'].initial = user_field.id
AttributeError: 'NoneType' object has no attribute 'id'
ERROR 2021-01-23 00:58:31,533 log 85374 140159710901824 Internal Server Error: /new/
Traceback (most recent call last):
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/tareq/.pyenv/versions/3.8.0/lib/python3.8/contextlib.py", line 75, in inner
return func(*args, **kwds)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/views/generic/base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/views/generic/edit.py", line 172, in post
return super().post(request, *args, **kwargs)
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/views/generic/edit.py", line 140, in post
form = self.get_form()
File "/home/tareq/.local/share/virtualenvs/Blog-i5phkViF/lib/python3.8/site-packages/django/views/generic/edit.py", line 33, in get_form
return form_class(**self.get_form_kwargs())
File "/home/tareq/Desktop/PERSONAL/Blog/blog/blog/articles/forms.py", line 19, in __init__
self.fields['author'].initial = user_field.id
AttributeError: 'NoneType' object has no attribute 'id'
您似乎缺少在用户提交表单时实际获取用户 ID 的逻辑。如果您查看此文档,您将看到您需要引用请求对象以获取用户信息并将视图逻辑分配 request.user_id 给新实例。