Django/Jquery/Javascript-如何使用url参数预填充表单(自动填充表单)

Django/Jquery/Javascript-如何使用url参数预填充表单(自动填充表单),javascript,jquery,django,forms,django-forms,Javascript,Jquery,Django,Forms,Django Forms,我想发送一些人的链接,比如: 如果他们单击该链接,它将转到页面/表单/其中是具有多个字段的表单 我想用q字符串预先填充它,以填充“email”输入 字符串中包含指定电子邮件的字段“example@me.com“ 网站是在Django做的,想请问什么是最好的方法来完成这一点 我应该使用JS、Jquery、Django吗?不知道从哪里开始 我想要这样的东西: 但是在我的网站上。有人能帮我做一些简单的表格和例子吗 谢谢 models.py from django.db import models

我想发送一些人的链接,比如:

如果他们单击该链接,它将转到页面/表单/其中是具有多个字段的表单

我想用q字符串预先填充它,以填充“email”输入

字符串中包含指定电子邮件的字段“example@me.com“

网站是在Django做的,想请问什么是最好的方法来完成这一点

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

我想要这样的东西:

但是在我的网站上。有人能帮我做一些简单的表格和例子吗

谢谢

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))
url.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>                
{%csrf\u令牌%}
request.GET.copy()
会给你一个字典,并将它作为
首字母
字典传递

initial = request.GET.copy()
form = MyForm(initial=initial)
它将填充表单中存在的字段

如果您想让
GET
POST
互换

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))

您可以用Django或JavaScript来实现

下面是一个JavaScript解决方案,使用这个问题

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

为您的电子邮件表单字段指定一个ID,例如
emailfield
,然后您可以执行以下操作

var emailField = document.getElementById("emailfield");
emailField.value = getParameterByName("email"); // "q" in your example url
在ready或onload处理程序中(或者简单地放在脚本标记中,作为正文部分的最后一项)

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

下面是一个例子是正确的。对于任何想用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
返回一个包含每个值的列表。

通过
request.GET
作为
初始值
数据,如果您遵循表单中相同的字段名称。否则,收集
GET
变量,并以
initial
的形式适当地传递它们刚才用我的python代码更新了问题我如何将您的解决方案实现到该代码中,对不起,我在django方面还不高,非常感谢上面的JS解决方案对我有用,但我更希望通过正确的方式了解Django解决方案。你能将你的解决方案应用到我的代码中吗?是GET还是POST请求?+1,如果我在服务器端执行此操作,可能就是这样。链接将从电子邮件中发送,表单已发布刚刚用代码更新了我的问题,你可以查看它,去检查你的解决方案谢谢此解决方案非常好,我仍然在寻找不使用JS的django解决方案,但是非常好的例子,非常感谢。