2013-04-08 2 views
0

나는 Towns 모델과 관련이있는 광고에 대한 모델을 가지고 있습니다. 이 모델에는 일부 메타 데이터가있는 도시 목록이 포함되어 있습니다.Django 양식. 어떻게 양식에 문자열을 게시하고 개체 ID로 저장?

제 양식에 저는 마을에 아약스 자동 완성을 구현했습니다. 각 마을에는 name_unique 필드가 있으며이 데이터를 기반으로 자동 완성 기능이 입력 양식 작성에 도움이됩니다.

그러나 실제로 Town.name_unique이 아닌 Town.id와의 관계가 필요합니다.

장고 양식이 name_unique 값을 받아들이고 마을의 실제 'ID'로 저장하도록 어떻게 수행 할 수 있습니까?

어떻게 형식 문자열에 게시

class Advert(models.Model): 
    class Meta: 
     verbose_name = u"Ogłoszenie" 
     verbose_name_plural = u"Ogłoszenia" 
     ordering = ['-date_added', ] 

    title = models.CharField(verbose_name="Tytuł ogłoszenia", max_length=32) 
    text = models.TextField(verbose_name="Treść ogłoszenia", max_length=3000) 

    location = models.ForeignKey("division.Towns", verbose_name="Miejscowość") 



class AdvertForm(ModelForm): 
    category = CustomTreeNodeChoiceField(queryset=Category.objects.filter(parent__isnull=False), 
             empty_label="Wybierz kategorię", label="Kategoria") 

    class Meta: 
     model = Advert 
     exclude = ('ip', 'user', 'first_name', 'last_name') 
     widgets = { 
      'location': TextInput 
     } 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(AdvertForm, self).__init__(*args, **kwargs) 



def add(request): 
    form = AdvertForm(request.POST or None, request=request) 

    if form.is_valid(): 
     advert = form.save(commit=False) 
     advert.save() 

     return HttpResponseRedirect(reverse('adverts.views.detail', kwargs={'pk': advert.pk})) 

    return TemplateResponse(request, "adverts/add.html", {'form': form, }) 

답변

1

로 저장하는 나는 그것을 위해 JQuery와 - 자동 완성 사용과 함께 한 그 사용자 지정 양식 필드/위젯. Basicly 위젯은 두 개의 입력 필드의 ID를 포함하는 숨겨진 하나의 텍스트 표현 및 자동 완성 로직을 포함하는 가시를 렌더링 :

자동 완성 필드가 변경되면
<input type="text" class="ac_input" name="%(name)s_text" id="%(html_id)s_text" value="%(text)s"/> 
<input type="hidden" name="%(name)s" id="%(html_id)s" value="%(value)s" /> 

, 서버에서 사전로드 [{id: "..", text:""}, ...]의 형식으로 텍스트 필드에 text 값을, 숨김 id 필드에 id를 포함하도록 설정합니다. 숨겨진 ID 필드는 양식에서 사용하는이 방법으로 원하는 ID를 포함합니다. 코드를 pastebin에 업로드했습니다 (링크 : http://pastebin.com/LncqfQM2). 코드는 조금 오래되었고 코멘트 죄송합니다, 반 누락 반 독일어 있습니다 : 양식에서 /내가 사용 :이 희망

def callback(request): 
    # some code loading the objects 
    return [{'id': row.pk, 'label':row.name} for row in objects] 

:

ort = AutocompleteModelChoiceField(Ort.objects, url=reverse("orte-autocompletecallback")) 

을 그리고보기 도움이됩니다.

편집 : 나는 코드의 재 작업 비트 (주석, 예제, 예제)를 시작했다. 메신저 완료되면 다른 링크를 게시/이전 링크를 편집하십시오.

+0

다음은 (약간의 unittests가 부족하다는 이유로 테스트되지 않았습니다 : /) 코드 업데이트 : http://pastebin.com/LncqfQM2 – Daishy

+0

감사합니다. :) – Efrin

관련 문제