【发布时间】:2014-09-18 15:07:05
【问题描述】:
我正在尝试使用 Django Generic Class-Based Views 来构建一个到两个模型数据库的 CRUD 接口。我有一个到父模型的工作 CRUD 接口,并且一直试图让子 Create 工作。为了与其他 Django 示例保持一致,将父级设为 Author,将子级设为 Book。允许用户将书籍添加到作者的最简单方法是什么?
在 HTML 术语中,我想我想在作者详细信息页面上创建一个包含作者 ID 的链接,将该 ID 预先设置在 Book 表单上,然后让 Book 表单处理使用该ID作为书的PK。但我不明白如何使用 Django 来实现这一点。我已经通读了https://docs.djangoproject.com/en/1.6/topics/class-based-views/generic-editing/、How do I use CreateView with a ModelForm、How do I set initial data on a Django class based generic createview with request data 和Set initial value to modelform in class based generic views,每一个似乎都回答了一个略有不同的问题。
以下是相关代码:
models.py
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(max_length=500)
views.py
class BookCreate(CreateView):
form_class = BookForm
def get_success_url(self):
return reverse('myapp:author_read',args=(self.object.author.pk))
forms.py
class BookForm(forms.Modelform):
class Meta:
model = Book
urls.py
url(r'^(?P<pk>\d+)/$', AuthorRead.as_view(), name='author_read'),
url(r'^book/create/(?P<author_id>\d+)/$', BookCreate.as_view(), name='book_create'),
templates/myapp/author_detail.html
...
<p><a href="{% url 'myapp:book_create' author_id=Author.pk %}">Add a book</a></p>
...
templates/myapp/book_form.html
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Done">
</form>
问题
1) 如何从图书页面 URL 中获取作者 ID 到作者表单,然后正确处理?通过上面的示例代码,Django 调试器显示它以这种方式存在:
View function Arguments Keyword arguments URL name
myapp.views.BookCreate () {'author_id': u'1234'} book_create
但我不明白如何从 ... 上下文中获取该变量? ...并将其放入表单中。
1a) 我可以将其设为 url 参数而不是 URL 本身的一部分,即 book/create?author=1234 而不是 book/create/1234/?或者甚至将整个内容设为 POST 以使其不是 URL 的一部分?最佳做法是什么?如何做到的?
2)一旦变量在表单中,它怎么能作为隐藏的输入出现,让用户不用看到呢?
【问题讨论】:
标签: python django django-class-based-views