0

我有一个与 Towns 模型相关的广告模型。该模型包含具有一些元数据的城镇列表。

在我的表单中,我为城镇实现了 ajax 自动完成功能。每个城镇都有一个 name_unique 字段,并基于此数据自动完成有助于填写输入表单。

但是,我实际上需要与 Town.id 而不是 Town.name_unique 的关系。

我如何执行这样的操作,以便 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 结合起来。基本上,小部件呈现两个输入字段,一个包含 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:""}, ...]并将文本字段设置为包含文本的值,并将隐藏的 id 字段设置为 id。这种方式隐藏的 id 字段被表单使用,它包含你想要的 id。我将我的代码上传到了一个 pastebin(链接: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 回答