Django形式。如何在表单中发布字符串并将其保存为对象ID?

时间:2013-04-08 16:18:24

标签: django forms validation post

我有一个与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, })

1 个答案:

答案 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]

我希望这会有所帮助。

编辑:我开始重新编写一些代码(整理一下,评论,示例)。如果即时完成,我在/编辑旧链接中发布另一个链接。