将外键放入表单

Posted

技术标签:

【中文标题】将外键放入表单【英文标题】:Getting a foreign key into a form 【发布时间】:2012-10-01 11:59:01 【问题描述】:

我是 Django 和 Python 的新手,我花了几天时间试图解决这个问题。我在这里的其他线程中尝试了几种方法,但我认为我缺少一些基本概念,因为它们都不适合我。这是我正在尝试做的事情:

我正在使用 ModelForm,并且我创建了一个用于添加包含外键的记录的表单。我希望默认设置此值以匹配我链接的页面上显示的记录。 [编辑下面显示的代码以显示建议的更正]。

这是来自views.py的相关代码:

def add_sighting(request):
unit = request.GET.get('unit')
form = SightingForm(request.POST or None, initial='unit':unit)
if form.is_valid():
    sighting = form.save(commit=False)
    sighting.save()
    return redirect(index)
return render_to_response('trainapp/add_sighting_form.html',
                          'unit': unit, 'sighting_form': form,
                          context_instance=RequestContext(request))

以下是 add_sighting_form.html 中的相关代码:

<form action="/trainapp/add_sighting/" method="post">
% csrf_token %
<table>
 sighting_form.as_table 
</table>
<input type="submit" value="Save" />
</form>

这是我链接的模板中的相关代码:

<p><a href="/trainapp/add_sighting/?unit= unit.id ">Add sighting</a></p>

【问题讨论】:

【参考方案1】:

这里可能有几种方法。

最简单的方法是在创建表单实例时使用初始参数,然后再将其传递到某个视图的上下文中。

假设您正在使用如下视图方法:

def some_view( request ):
    id = request.GET.get( 'record-id' )
    # do check if id is valid...

    # load some record
    record = Record.objects.get( pk=id )

    # create a form instance
    form = RecordForm( initial= 'some_key_field_name':record.id  )

    # set up context
    context = Context(
         'record' : record,
         'form' : form
    )

    # render the templateview using the above context
    # and return a HttpResponse ...

如果您改用基于类的视图,您可能会覆盖 get_context_data 以获得类似的结果。

基于类的视图

根据您的代码,我还想建议您查看 Django 中基于类的视图。 可以为您处理获取和发布表格。它甚至会为您创建(默认)表单。

发布的代码相当于这样:

class CreateSightingView( CreateView ):

    model = Sighting

    def get_context_data( self, **kwargs ):
        # call the super to get the default context
        data = super( CreateSightingView, self ).get_context_data( **kwargs )

        # add the initial value here
        # but first get the id from the request GET data
        id = self.request.GET.get( 'record-id' )
        # again: do some checking of id
        data.get( 'form' ).initial[ 'unit' ] = id

        return data

【讨论】:

我不确定我是否已将这个概念正确应用到我的代码中(我已将其添加到我上面的问题中)。当我点击表单上的“保存”时,出现以下错误:“IntegrityError at /trainapp/add_sighting/”、“trainapp_sighting.unit_id may not be NULL”。 错误到底发生在哪里?如果它在线:form = SightingForm(request.POST or None, initial='unit':unit.id) 那么我会认为unit.id == null,这反过来会表明unit 的pk 不是一个名为id 的字段。是这样吗? 我认为这会将主键的初始值设置为1,对吗?我想要做的是将值设置为与我链接的页面相匹配。 嗯,您之前在帖子中显示的代码实际上也是如此。你得到一个 pk=1 的单位,然后将该 id 作为初始数据传递给表单。我刚刚向您展示了在表单中设置 id 的方法。我不能告诉你从哪里得到 id,因为我不知道在哪里可以找到它。最简单的方法是将表单请求中的 id 作为 GET 变量传递。这样你就可以得到它,如上面编辑的代码所示。您也可以将其作为 url kwarg 传递;显示了一个 url kwarg 的示例here 谢谢。感谢您对此的帮助。我将四处寻找有关如何将表单请求中的 id 作为 GET 变量传递的信息。我是否可以提供其他信息来帮助您完成该步骤?

以上是关于将外键放入表单的主要内容,如果未能解决你的问题,请参考以下文章

通过 post 将外键的 id 传递给表单

Laravel - 如何将外键用于具有识别外键的表?

实体 Remove() 将外键属性设置为 null

将外键添加到用户表时 Laravel 7 错误

将外键添加到迁移(Laravel)

SQL将外键添加到现有列