0

Towns モデルに関連する広告モデルがあります。このモデルには、いくつかのメタデータを持つ町のリストが含まれています。

私のフォームでは、町の ajax オートコンプリートを実装しました。各町には name_unique フィールドがあり、このデータに基づいてオートコンプリートが入力フォームの入力に役立ちます。

ただし、実際には Town.name_unique ではなく Town.id との関係が必要です。

djangoフォームが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, })
4

1 に答える 1

1

そのために JQuery-Autocomplete を使用し、それをカスタム FormField/Widget と組み合わせました。基本的に、ウィジェットは 2 つの入力フィールドをレンダリングします。1 つは ID を含む非表示、もう 1 つはテキスト表現とオートコンプリート ロジックを含む可視です。

<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" />

autocomplete-field が変更されると、サーバーからディクショナリが の形式でロードされ、[{id: "..", text:""}, ...]text-field に text の値が含まれるように設定され、非表示の id-field が id に設定されます。このようにして、非表示の id フィールドがフォームで使用され、必要な id が含まれます。コードをペーストビンにアップロードしました (リンク: http://pastebin.com/LncqfQM2 )。コードは少し古く、コメントは半分欠落しており、半分ドイツ語です。申し訳ありません:/私が使用する形式では:

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

そしてビューで:

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

これが役立つことを願っています。

編集:コードの一部を作り直し始めました(少し整理、コメント、例)。終了したら、別のリンクを投稿するか、古いリンクを編集します。

于 2013-04-08T20:18:57.193 に答える