我有一个与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, })
答案 0 :(得分: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" />
如果更改了autocomplete-field,它将以[{id: "..", text:""}, ...]
的形式从服务器加载字典,并将text-field设置为包含text的值,将隐藏的id-field设置为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]
我希望这会有所帮助。
编辑:我开始重新编写一些代码(整理一下,评论,示例)。如果即时完成,我在/编辑旧链接中发布另一个链接。