我正在使用CreateView,我知道一些字段值会提前。在下面的示例中,我知道新Entry对象的author字段将是当前用户,我使用get_initial()来预设它。
现在我想从我的模板表单中省略这个字段。我尝试了几种方法:
只需在表单模板中注释掉作者字段,就会导致表单无效。
离开'作者'在外地。不。
这是一个相关的问题。以下示例涉及与存在的User对象的关系。但是如果我需要创建一个对象,比如一个编辑器的auth Group呢?我尝试过创建一个占位符组并对其进行重命名......而且,这样做并不是很好。
#
# model
#
class Author(Model):
name = CharField(max_length = 60)
user = OneToOneField(to = User, related_name = 'author_user', on_delete = CASCADE)
class Entry(Model):
title = CharField(max_length = 60)
author = ForeignKey(to = Author, related_name = 'entry_author')
#
# view
#
class EntryCreateView(CreateView):
model = Entry
fields = ('title', 'author')
def get_initial(self):
initial = super(EntryCreateView, self).get_initial()
initial['author'] = get_object_or_404(Author, user = self.request.user)
return initial
#
# template
#
{% extends "base.html" %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
<label for="{{ form.title.id_for_label }}">Title:</label>
{{ form.title }}
<label for="{{ form.author.id_for_label }}">Author:</label>
{{ form.author }}
<p>
<input type="submit" class="btn btn-primary" name="save" value="Save" />
<input type="submit" class="btn btn-primary" name="cancel" value="Cancel" />
</form>
{% endblock %}
答案 0 :(得分:1)
您需要为所需的自定义项创建ModelForm(https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/)。
您无法删除作者,因为目前您的模型需要它。
尝试这样的事情:
class EntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['title', 'author']
def __init__(self, *args, **kwargs):
initial = kwargs.get('initial', {})
self.author = initial.get('author')
super(EntryForm, self).__init__(*args, **kwargs)
您可以在__init__
或类中修改字段(设置为不需要,从表单字段中删除字段等)。
只需在您的视图中导入并引用此表单即可使用它。
答案 1 :(得分:1)
您可以使用form_valid()
类的EntryCreateView
方法手动设置用户:
class EntryCreateView(CreateView):
model = Entry
fields = ('title',)
def form_valid(self, form):
user = self.request.user
form.instance.user = user
return super(EntryCreateView, self).form_valid(form)