如何将值从视图传递到不可编辑的字段django python
Posted
技术标签:
【中文标题】如何将值从视图传递到不可编辑的字段django python【英文标题】:how to pass value from views to non-editable field django python 【发布时间】:2020-09-25 01:58:52 【问题描述】:我想将用户自动插入以下模型:
class Moduls(models.Model):
module_name = models.CharField(max_length=255)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, db_column='created_by', blank=False, null=False , on_delete=models.CASCADE, editable = False)
我有两种情况: 1-在 django admin 中,我通过以下方式解决了这个问题 * 添加editable = False到由字段创建 * 在 admin.py 我使用了以下内容:
def save_model(self, request, obj, form, change):
obj.created_by = request.user
super().save_model(request, obj, form, change)
但是当我尝试使用 forms.py 时遇到问题,我无法从用户 views.py 传递用户,如果我想将 created_by 字段添加到我的表单中,我会遇到此错误:
不能为 Moduls 模型表单指定“created_by”,因为它是不可编辑的字段
【问题讨论】:
【参考方案1】:您通常不在表单中设置它,而是在视图中设置。所以你定义了一个看起来像这样的表单:
class ModulsForm(forms.ModelForm):
class Meta:
model = Moduls
fields = ['module_name']
然后在视图中设置包装在视图中的实例的created_by
字段。所以对于基于函数的视图,它看起来像:
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
@login_required
def some_view(request):
if request.method == 'POST':
form = ModulsForm(request.POST, request.FILES)
if form.is_valid():
form.instance.created_by = request.user
form.save()
return redirect('name-of-some-view')
else:
form = ModulsForm()
return render(request, 'name-of-some-template.html', 'form': form)
或在基于类的视图中,例如CreateView
,您覆盖form_valid
方法:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import CreateView
class ModulsCreateView(LoginRequiredMixin, CreateView):
model = Moduls
form_class = ModulsForm
# …
def form_valid(self, form):
form.instance.created_by = self.request.user
return super().form_valid(form)
【讨论】:
以上解决了我的问题。但是您能否告诉我实例的重要性是什么,因为我在没有实例的情况下制作了这个解决方案不起作用但是在我添加实例之后它工作正常以上是关于如何将值从视图传递到不可编辑的字段django python的主要内容,如果未能解决你的问题,请参考以下文章