将数据从模板传递到Django中的视图

时间:2015-07-15 15:56:52

标签: django

从Django模板中,我将id作为参数及其url传递。

<a href="/add/?q={{mytable.id}}" >Next</a>

当我点击下一步时,它会转到页面&#39;添加&#39;带有id参数(localhost / add /?q = 5c23451)。我将此参数的值赋给变量。

q1=request.GET.get('q','')

然后,我尝试从数据库中获取所有id =&#39; id&#39;如下:

obj=mytable.objects.get(id='q1')

问题是当我尝试打印q1时,它总是空的。你能告诉我哪里出错了吗?

整个视图

def addview(request):
    q1=request.GET.get('q','')
    if request.method == 'POST':
        form= myform(request.POST)
        if form.is_valid():
            obj=mytable.objects.get(id=q1)
            obj.info = form.cleaned_data['info']
            obj.url= form.cleaned_data['content']
            obj.save()
        return HttpResponseRedirect('/success/')

    else:
        form=myform()
    variables=RequestContext(request, {
    'form':form
    })

    return render_to_response('/add/add.html', variables,)

forms.py

class myform(forms.Form):

info=forms.CharField(max_length=100)
content=forms.URLField()

2 个答案:

答案 0 :(得分:4)

您正在查询字符串"q1"而不是变量q1

obj = mytable.objects.get(id=q1)

请注意,Python中的行不应以分号结尾。

修改

当您发布表单而不是初始GET时,会发生这种情况。这是因为提交表单时不会保留GET变量。

你真的需要回到基础上。通过GET参数传递ID不是在Django中执行操作的正确方法。你应该在URL本身传递它;这更容易由内置工具生成,并且在您提交时将保留该值。

首先,您的addview网址需要接受参数:

url(r'^add/(?P<id>\d+)/$', views.addview, name='add'),

您的链接现在应使用{% url %}模板标记:

<a href="{% url "add" id=mytable.id %}" >Next</a>

现在,您的视图需要接受该参数:

def addview(request, id):
    obj = mytable.objects.get(id=id)

这将自行解决您的问题,但您应该进行另一项改进,即使用ModelForm而不是普通表单。更改表格如下:

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ('info', 'url')

现在您的观点变为:

def addview(request, id):
    obj = mytable.objects.get(id=id)
    if request.method == 'POST':
        form = MyForm(request.POST, instance=obj)
        if form.is_valid():
            form.save()
            return redirect('success')
    else:
        form = MyForm(instance=obj)
    return render(request, 'add/add.html', {'form': form})

答案 1 :(得分:0)

你正在尝试的事情是不正确的。 a href正在使用GET请求。如果您点击该链接,则不会发布任何数据。此时它也不会进入if request.method == 'POST'条件。然后,如果您有POST的表单。然后设置表单属性action='/add/?q={{mytable.id}}'。然后它将有request.POSTrequest.GET(现在)。