2012-03-01 53 views
0

我使用的是django-selectable,无法从模板中保存代表类别id的“id”('autocomplete_1')。django-selectable - 从模板中保存数据的问题

models.py

class Category(models.Model): 
cat_no = models.IntegerField(null=True, blank=True) 
cat_txt = models.CharField(max_length=45)  
def __unicode__(self): 
    return self.cat_txt 

class Cattest(models.Model): 
category = models.ForeignKey(Category)  
info = models.CharField(max_length=35, blank=True) 

lookups.py

class CategoryLookup(ModelLookup): 
model = Category 
search_fields = ('cat_txt__icontains',) 

forms.py

class CategoryForm(forms.Form): 
autocomplete = forms.CharField(
    label='Type the name of a category (AutoCompleteWidget)', 
    widget=selectable.AutoCompleteWidget(CategoryLookup), 
    required=False, 
) 
autocompleteselect = selectable.AutoCompleteSelectField(
    lookup_class=CategoryLookup, 
    label='Select a category (AutoCompleteField)', 
    required=False, 
) 

class CattestForm(forms.Form): 
#model = cattest 
#fields = ('category', 'info') 
autocomplete = forms.CharField(
    label='Type the name of a category (AutoCompleteSelectWidget)', 
    widget=selectable.AutoCompleteSelectWidget(CategoryLookup), 
    required=False, 
) 
info = forms.CharField(max_length=35, label="Information") 

views.py

def cattest(request): 
if request.method == 'POST': 
    form = CattestForm(request.POST) 
    if form.is_valid(): 
     cattest = Cattest.objects.create(
      category=form.cleaned_data['autocomplete_1'], 
      info=form.cleaned_data['info'], 
     ) 
     # Always redirect after a POST 
     return http.HttpResponseRedirect('/bsmain/login_customer')    
else: 
    if request.GET: 
     form = CattestForm(initial=request.GET) 
    else: 
     form = CattestForm() 
return render_to_response('bsmain/form.html', {'form': form}, context_instance=RequestContext(request)) 

回溯:

KeyError异常在/ bsmain/cattest/

'autocomplete_1'

请求方法:POST 请求URL:http://127.0.0.1:8000/bsmain/cattest/ Django的版本:1.3.1 异常类型:KeyError异常 异常值:

'autocomplete_1'

异常位置:/ home /票据/工作区/ boatsite /../ boatsite/bsmain /在cattest views.py 64行 Python的可执行文件:在/ usr/bin中/ Python的 Python版本:2.6.5

索取信息

得不到GET数据 POST变量值

info    u'44# Bruce' 
    csrfmiddlewaretoken  u'9ffe49bd68be04087521e71e86a5bec0' 
    autocomplete_1 u'10' 
    autocomplete_0 u'Anchors' 

回答

1

形式cleaned_data字典是基于字段名称填充。您应该访问form.cleaned_data['autocomplete']的数据。

编辑:

这很可能是通过使用ModelForm简单:

class CattestForm(forms.ModelForm): 

    class Meta: 
     model = Cattest 
     fields = ('category', 'info',) 
     widgets = { 
      'category': selectable.AutoCompleteSelectWidget(CategoryLookup) 
     } 


def cattest(request): 
    if request.method == 'POST': 
     form = CattestForm(request.POST) 
     if form.is_valid(): 
      cattest = form.save() 
      # Always redirect after a POST 
      return http.HttpResponseRedirect('/bsmain/login_customer')    
    else: 
     initial = request.GET or None 
     form = CattestForm(initial=initial) 
    return render_to_response('bsmain/form.html', {'form': form}, context_instance=RequestContext(request)) 
+0

马克 - 我试过了。我收到一个错误:ValueError at/bsmain/cattest/ 无法分配“u”'“:”Cattest.category“必须是”类别“实例。 – BillB1951 2012-03-02 03:28:22

+0

..如果我使用form.cleaned_data ['category']我得到KeyError at/bsmain/cattest/ 'category'我认为django-selectable是一个很棒的应用程序,我希望我能尽快为它工作。 – BillB1951 2012-03-02 03:41:17

+0

有几个问题与您当前的表单有关。 'autocomplete'不是必需的,但类别要填充。它也不会返回正确的类型作为您的第一条评论。我已经使用ModelForm添加了一个示例。 – 2012-03-02 04:14:34