【问题标题】:Django / Jquery / Javascript - How to prepopulate form with url parameters (autofill the form)Django / Jquery / Javascript - 如何使用 url 参数预填充表单(自动填充表单)
【发布时间】:2013-05-23 17:05:56
【问题描述】:

我想给一些人发链接让我们说:

http://www.example.com/form/?q=example@me.com

如果他们点击链接,它将转到页面 /form/ 包含多个字段的表单。

我想用填充“电子邮件”输入的 q 字符串预填充它

字符串“example@me.com”中带有指定电子邮件的字段。

网站是用 Django 完成的,想问一下最好的方法是什么。

我应该使用 JS、Jquery、Django 吗?不知道从哪里开始。

想要这样的东西:

http://support.unbounce.com/entries/307658-Can-I-pre-populate-a-form-with-URL-parameters-VIDEO-

但在我的网站上。有人可以提供简单的表格和示例吗?

谢谢

models.py

from django.db import models

class Example(models.Model):
    username = models.CharField(max_length=200, blank=True)
    email = models.CharField(max_length=200)
    image = models.ImageField(upload_to='profiles', blank=True)
    text = models.CharField(max_length=200, blank=True)

forms.py

from django import forms

from models import Example

class ExampleForm(forms.ModelForm):
    class Meta:
        model = Example

views.py

from django import forms
from models import Example
from forms import ExampleForm

from django.template import RequestContext, Context
from django.core.context_processors import csrf

from django.shortcuts import render_to_response
from django.shortcuts import render_to_response, get_object_or_404

from django import http

import os
import json
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.conf import settings

def index(request):
    if request.method == "POST":
        form = ExampleForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return http.HttpResponseRedirect('/success/')
    else:
        form = ExampleForm()

    return render_to_response('index.html', {'title': 'Example Form', 'form': form},context_instance=RequestContext(request))

urls.py

from django.conf.urls import patterns, include, url
from django.conf import settings

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^$', 'signup.views.index', name='index'),
    url(r'^admin/', include(admin.site.urls)),
)

索引模板

<form id='add_cat' method='post' enctype="multipart/form-data">{% csrf_token %}


    <input id="id_username" maxlength="200" name="username" type="text" placeholder="username"> 
    <input id="id_email" maxlength="200" name="email" type="text" >   

    <input id="id_picture" maxlength="200" name="picture" type="text">

    <textarea id="id_text" row="3" name="first_text" placeholder="Type something…"></textarea>

    <input id="add_cat_btn" type='submit' value="save">

 </form>                

【问题讨论】:

  • 如果您遵循与表单中相同的字段名称,则将request.GET 传递为表单中的initial 数据。否则收集GET 变量并以initial 形式适当地传递它们

标签: javascript jquery django forms django-forms


【解决方案1】:

request.GET.copy() 会给您一个字典,并将其作为initial 字典传递。

initial = request.GET.copy()
form = MyForm(initial=initial)

它将填充表单中存在的字段。

如果GETPOST 可以互换,

def index(request):

    initial = {}
    if request.GET:
        initial = request.GET.copy()

    form = ExampleForm(initial=initial)

    if request.method == "POST":
        if request.POST:
            initial = request.POST.copy()
        form = ExampleForm(request.POST, request.FILES, initial=initial)
        if form.is_valid():
            form.save()
            return http.HttpResponseRedirect('/success/')


    return render_to_response('index.html', {'title': 'Example Form', 'form': form },context_instance=RequestContext(request))

【讨论】:

  • 刚刚用我的 python 代码更新了这个问题,我怎样才能在该代码中实现你的解决方案,对不起,我在 django 方面还不够先进,还在学习中,非常感谢
  • 上述 JS 解决方案对我有用,但我宁愿使用正确的方式了解 Django 解决方案。您可以将您的解决方案应用于我的代码吗?
  • 是 GET 还是 POST 请求?
  • +1,如果我要在服务器端执行此操作,可能就是这样。
  • 链接将从邮件中发送,形式为 POST
【解决方案2】:

您可以在 Django 或 JavaScript 中执行此操作。

这是使用该 SO 问题中的getParameterByName 的 JavaScript 解决方案。

在 JS 中这样做的好处是它可以让你缓存服务器响应,并且不需要服务器对每个用户请求进行计算。

为您的电子邮件表单字段提供一个 ID,例如 emailfield,然后您可以执行类似的操作

var emailField = document.getElementById("emailfield");
emailField.value = getParameterByName("email"); // "q" in your example url

在您的准备就绪或 onload 处理程序中(或简单地放在作为正文部分最后一件事的脚本标记中)

Here is a fiddle

它不起作用,因为它将代码放在 iframe 中,因此您无法访问 GET 参数,如果您检查 iframe,您可以看到它有效:

这是一个例子http://fiddle.jshell.net/FA9fQ/show/light/?email=hello

【讨论】:

  • 刚刚用代码更新了我的问题,你可以看看,去检查你的解决方案谢谢
  • 这个解决方案效果很好,我还在寻找不使用JS的django解决方案,但是很好的例子,非常感谢。
【解决方案3】:

karthikr's answer 是正确的。对于任何想通过 Django 的基于类的视图来实现这一点的人来说,这可以使用get_initial 方法来完成。下面是一个可重复使用的示例:

class RequestInitialFormViewMixin(object):
    """Pass Request.GET as initial values to Form"""
    def get_initial(self):
        initial = super(RequestInitialFormViewMixin, self).get_initial()
        if self.request.GET:
            for key, value in self.request.GET.items():  # QueryDict, each value is a list
                if len(value) == 1:
                    initial[key] = value[0]
                else:
                    initial[key] = value
        return initial

class MyFormView(RequestInitialFormViewMixin, FormView):
    # ...

请注意,request.GET 返回一个 QueryDict,其中包含每个值的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 2012-09-08
    • 2020-10-18
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多