如何将值从视图传递到不可编辑的字段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的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从 html 传递到 django 中查看?

如何将值从mysql传递到创建视图中的表单字段

将值从 Django 视图传递到 AngularJS 插入的模板

如何将值从Django模板传递给View

JSP 将值从表传递到表单

如何将值从 django 模板化 html 传递到 ajax