Python 如何从Django中的链接设置预定义的表单值?

Python 如何从Django中的链接设置预定义的表单值?,python,django,forms,Python,Django,Forms,我的项目是这样安排的: 1. page has many: categories 2. category belongs to: page has many: items 3. item belongs to: category 当我进入一个我想修改的页面(向这些类别中添加新类别或新项目)时,到目前为止,我只能通过一个主链接添加一个新类别或项目,该链接使我进入一个表单,我必须在其中选择项目必须属于哪个类别。我想做的是在类别标题旁边有一个链接“添加新项目”,当我点击它

我的项目是这样安排的:

1. page
   has many: categories

2. category
   belongs to: page
   has many: items

3. item
   belongs to: category
当我进入一个我想修改的页面(向这些类别中添加新类别或新项目)时,到目前为止,我只能通过一个主链接添加一个新类别或项目,该链接使我进入一个表单,我必须在其中选择项目必须属于哪个类别。我想做的是在类别标题旁边有一个链接“添加新项目”,当我点击它时,项目表单默认设置为该类别。我该怎么做?我当前的表单看起来非常原始,如下所示:

{% extends "base.html" %}
{% block content %}

{% if page.id %}
<h1>Edit Category</h1>
{% else %}
<h1>Add Category</h1>
{% endif %}

<form action="{{ action }}" method="POST">
    {% csrf_token %}
    <ul>
        {{ form.as_ul }}
    </ul>
    <input type="submit" id="save_page" value="Save" class="success button" /> <a href="javascript:window.history.back();">Cancel</a>
</form>

{% endblock %}
{%extends“base.html”%}
{%block content%}
{%if page.id%}
编辑类别
{%else%}
添加类别
{%endif%}
{%csrf_令牌%}
    {{form.as_ul}}
{%endblock%}
因此,执行此操作的方法是将其完全从表单中排除,并在保存时在视图中进行设置

class ItemForm(forms.ModelForm):
    class Meta:
        model = Item
        exclude = ('category',)
以及以下观点:

def create_item(request, category_id):
    if request.method == 'POST':
        form = ItemForm(request.POST)
        if form.is_valid():
            item = form.save(commit=False)
            item.category_id = category_id
            item.save()
            return redirect(...)
    ...etc...
通过url提供:

url(r'^create_item/(?P<category_id>\d+)/$, 'create_item', name='create_item'),
url(r'^create\u item/(?P\d+)/$,'create\u item',name='create\u item'),
因此,您可以从类别列表中链接到:

{% for category in categories %}
    <li>{{ category.name }} - <a href="{% url 'create_item' category.id }">Create item</a></li>
{% endfor %}
{%用于类别中的类别%}
  • {{category.name}}-
  • {%endfor%}
    您真的希望(预选的)类别字段显示在表单上,还是在保存项目时自动设置?类别显示为下拉字段。我希望它自动跳转到父类别,这样用户就不必触摸它。这并不能真正回答问题:你希望他们能够在必要时更改它吗?或者它根本不应该显示并自动设置?它根本不应该显示并自动设置。感谢您发布答案,但由于我尝试了这一点,它无法工作,因为错误被抛出,因为找不到“ItemForm”,而且我自己也没有设法修复它。因此,我采用了另一种方法,通过GET变量发送页面id,然后根据该变量设置select选项。使用您已经传递的任何表单来代替ItemForm:只要添加
    exclude
    行即可。