django-selectable - проблема с сохранением данных из шаблона - PullRequest
0 голосов
/ 02 марта 2012

Я использую django-selectable и не могу сохранить "id" ('autocomplete_1'), который представляет идентификатор для категории --- из шаблона.

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 at/ bsmain / cattest /

'autocomplete_1'

Метод запроса: URL-адрес запроса POST: http://127.0.0.1:8000/bsmain/cattest/ Версия Django: 1.3.1 Тип исключения: KeyError Значение исключения:

'autocomplete_1'

Расположение исключения: /home/bill/workspace/boatsite/../boatsite/bsmain/views.py в cattest, строка 64 Исполняемый файл Python: / usr / bin / python Версия Python:2.6.5

Запрос информации

GET Нет данных GET POST Значение переменной

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

1 Ответ

1 голос
/ 02 марта 2012

Форма словаря cleaned_data заполняется на основе имен полей. Вы должны получить доступ к данным из form.cleaned_data['autocomplete'].

Edit:

Это, вероятно, будет проще, если использовать 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))
...