具有固定初始值的CreateView和相关模型字段

时间:2016-05-19 18:32:17

标签: django django-models django-forms django-templates django-views

我正在使用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 %}                                                                                                                             

2 个答案:

答案 0 :(得分:1)

您需要为所需的自定义项创建ModelForm(https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/)。

您无法删除作者,因为目前您的模型需要它。

尝试这样的事情:

在forms.py ...

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)