【问题标题】:Initializing form input fields from url parameters in Django从 Django 中的 url 参数初始化表单输入字段
【发布时间】:2016-11-29 12:31:44
【问题描述】:

我正在根据“Django by Example”一书中的说明构建自己的项目。

但是我被困在django如何使用URL参数初始化输入表单字段

#models.py
class Image(models.Model):  
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    url = models.URLField()
    (...)

#views.py
def image_create(request):
    if request.method == 'POST':
        form = ImageCreateForm(data=request.POST)
        (...)
    else:
        form = ImageCreateForm(data=request.GET)
    return render(request,
              'create.html',
              {'form': form})
#forms.py
class ImageCreateForm(forms.ModelForm):
    class Meta:
        model = Image
        fields = ('title', 'url', 'description')
        widgets = {
            'url': forms.HiddenInput,
        }
#create.html
{% extends "base.html" %}
{% block content %}
<h1>Bookmark an image</h1>
<img src="{{ request.GET.url }}" class="image-preview">
<form action="." method="post">
    {{ form.as_p }}
    {% csrf_token %}
    <input type="submit" value="Bookmark it!">
</form>
{% endblock content %}

我找不到任何特定的代码行来明确告诉获取 request.GET 参数并将每个参数分配给相应的输入字段。 我假设所有这些都与在线表单初始化有关:form = ImageCreateForm(data=request.GET) in views.py

问题:

  1. 谁能解释一下 django 如何使用 request.GET 参数来初始化输入字段值(为它们分配 URL 参数的值)? 对于每个 request.GET 键,它是否只是匹配相应的输入字段“名称”属性,然后将与 request.GET 中的键对应的值分配给该特定输入字段?
  2. 还有人可以确认模型/表单(哪个?)字段名称与 URL 参数之间是否存在关系?
  3. 这两者有什么区别(因为它们似乎都以相同的方式工作,除了后者在输入字段值中返回列表):

    form = ImageCreateForm(data=request.GET)

    form = ImageCreateForm(initial=request.GET)

【问题讨论】:

  • 这里至少有3个问题,理想情况下应该是1个。 (最好单独询问他们,以增加获得答案的机会。)
  • @TinyInstance 感谢您的指点。我只是认为,如果所有问题都与同一个问题有关,那么在同一个帖子中提问会更容易。

标签: python django forms django-forms


【解决方案1】:

1) 是的 - request.GET 只是一个花哨的字典(技术上是一个 QueryDict),并且表单“数据”参数需要一个带有与表单中的字段对应的键的字典。如果它具有代表字段的正确键,则从技术上讲,您可以将表单传递给任何字典。

2) 一般来说,模型/表单字段和url参数之间没有关系。但是,如果您使用某些基于类的视图(例如 DetailView),如果您在 url 中设置了 slug 或 id,它将将该值传递给视图并将其映射到对象 slug 或 id。下面链接中的 get_object() 方法有一个例子。

https://ccbv.co.uk/projects/Django/1.9/django.views.generic.detail/DetailView/

3) 表单的数据属性是提交(通常是发布)到表单的内容,而初始值是在第一页加载时传递给表单的内容。例如,如果您正在编辑一个对象,通常现有的对象数据将填充初始值。然后,如果您对表单进行 POST 编辑,它将作为数据传入。

【讨论】:

    猜你喜欢
    • 2015-06-22
    • 1970-01-01
    • 2023-03-29
    • 2010-10-23
    • 2018-02-19
    • 1970-01-01
    • 2014-09-28
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多