0

我试图让用户从列表(从数据库)中选择一个“事物”,然后使用该记录在数据库中查找其他内容。但我无法从选择页面获取选择信息。

我会尽量让这成为相关代码的一个非常完整的快照,但我可能会删除太多或留下太多,抱歉。

我的模型.py:

urlpatterns = patterns('',
url(r'^$', 'dblook.views.index', name='home'),
url(r'^dblook3/', 'dblook.views.try3', name='home2'),
url(r'^dblook4/', 'dblook.views.try4', name='home3'),
)

我的 dblook/models.py:

from django.db import models
class serial_number(models.Model):
    def __unicode__(self):
        return self.serialno
        #return self.question
    class Meta:
        managed=False
        db_table='serial_number'
    sn_id = models.AutoField(primary_key=True)
    serialno = models.CharField(max_length=128)
    comment = models.ForeignKey(comment,null=True,db_column='comment')

我的views.py(我将跳过除了数据库模型导入之外的所有导入。如果有人真的想要它们,我会用它们更新)

from dblook.models import *
class SerialnoSelectForm(forms.Form):
    serialno = forms.CharField(max_length=16)
    selected = forms.BooleanField()

class serialform(ModelForm):
    class Meta:
        model = serial_number
        exclude=('comment','sn_id')
    selected = forms.BooleanField()

class snselect(forms.Form):
    sno = forms.ChoiceField()

def try3(request):
    if ( request.POST ):
        output = "HEllo world, thanks for posting"
        return HttpResponse(output)
    else:
        sslst = snselect(serial_number.objects.filter(serialno__startswith="A128").order_by('-serialno'))
        t = loader.get_template('select_serialno.html')
        c = Context({
            'sslst': sslst,
            })
        c.update(csrf(request))
        return HttpResponse(t.render(c))

def try4(request,dsn):
    if ( request.POST ):
        output = "HEllo world, thanks for posting to 4"
        return HttpResponse(output)
    else:
        return HttpResponse("Error")

我的模板(select_serialno.html)是:

<h1>Select a serial number</h1>
 <ul>
   <form method='post' action'='/dbtest4/{{serial_number.sn_id}}/showme'>
     {% csrf_token %}
     {% for sn in sslst %}
     <input type="submit" name="sn.serialno" id="choice{{ forloop.counter }}" value="{{choice.id}}"/>
     <label for="choice{{ forloop.counter }}">{{ sn.serialno }}</label><br/>
     {% endfor %}
     <input type="submit" value="data" />
</form>

当我转到 dblook3 时,我从序列号数据库中获得了一个不错的列表,以及一个按钮,如果我点击该按钮,它会立即转到 dblook4 URL(在这种情况下,它总是'/dbtest4//showme/' 而不是类似'/dbtest4/3/showme/)。不幸的是,我似乎无法分辨他们按下了什么按钮。

无论我为 '东西' 放入什么<form method='post' action'='/dbtest/{{stuff}}/showme'>,它总是空的。

我也尝试过if( 'choice' in request.POST ):veiws.py 中的 try4 之类的方法,但这也不起作用。

那么,我如何获得有关从“look3”到“look4”中选择的内容的任何信息?我会接受任何事情...但是,如果您能解释我为什么这样做,希望您的回答不仅可以解决我的问题,还可以帮助其他人理解...

(如果上面看起来很“进化”,那是因为我已经破解了 3 天了......)

谢谢!

4

1 回答 1

0

您需要POST将信息发送到look4dblook 表单:

<form method='post' action'='{% url dblook.views.try4 %}'>

目前你有/dbtest/{{serial_number.sn_id}}/showme这没有任何意义。您的上下文中没有serial_number变量,所以我不知道它来自哪里。您def try4(request,dsn):的视图定义表明您正在尝试try4根据从视图中选择的内容在视图上加载信息try3(尽管我猜测这是因为您没有解释您要做什么)。如果是这种情况,您需要根据通过 POST 传递的数据而不是 url 参数来执行此操作。非常模糊的东西如下:

def try4(request):
    if request.method == "POST":
        form = snselect(request.POST)
        if form.is_valid():
            data = form.cleaned_data
            # Get the selected item from your choice field and retrieve the 
            # corresonding model object with that id
            ...
于 2012-11-07T22:28:13.777 回答