如何将当前用户ID作为Django表单中的隐藏字段传递?

xyz*_*ace 2 forms django hidden

我遇到的问题是我正在尝试创建一个表单,通过将其嵌入ModelForm中的隐藏字段中来传递当前登录的用户ID.

我的模特:

class Portfolios(models.Model):
    id = models.AutoField(primary_key=True)
    port_name = models.CharField(max_length=135, blank=True)
    port_type = models.ForeignKey(PortType, null=True, db_column='port_type', blank=True)
    user = models.ForeignKey(User)

    def __unicode__(self):
        return self.port_name;

class Meta:
    db_table = u'tbl_portfolios'
Run Code Online (Sandbox Code Playgroud)

我的表格:

class PortfoliosCreateForm(ModelForm):
    class Meta:
        model = Portfolios;
Run Code Online (Sandbox Code Playgroud)

我的模板:

<form action="" method="post">
    {% csrf_token %}
    {% for field in form %}
        <div class="create_form_field">
            {{ field.errors }}
            {{ field.label_tag }}: {{ field }}
        </div>
    {% endfor %}
    <input type="submit" value="Create" /></p>
</form>
Run Code Online (Sandbox Code Playgroud)

我使用通用的创建视图调用模板:

url(
    r'^portfolios/create/$',
    'django.views.generic.create_update.create_object',
    dict(
        form_class=PortfoliosCreateForm,
        post_save_redirect='/',
        template_name='portfolios/create.html'
    )
Run Code Online (Sandbox Code Playgroud)

)

如何在该表单中最好地嵌入用户ID,以便它通过隐藏字段?或者我应该简单地传入一个虚拟字段并在自定义保存功能中填入值?

编辑:用户模型是内置的Django用户模型.

谢谢

Jak*_*cil 13

表单提交后,从请求中获取当前用户会更安全.您可以将通用视图重写为以下内容:

from django.shortcuts import redirect, render

def create_portfolio(request):
    if request.method == 'POST':
        form = PortfoliosCreateForm(request.POST)
        if form.is_valid():
            portfolio = form.save(commit=False)
            portfolio.user = request.user  # The logged-in user
            portfolio.save()
            return redirect('/')
    else:
        form = PortfoliosCreateForm()
    return render(request, 'portfolios/create.html', {'form': form})


url(r'^portfolios/create/$', create_portfolio)


class PortfoliosCreateForm(ModelForm):
    class Meta:
        model = Portfolios;
        exclude = ['user']   # Will be taken from the request
Run Code Online (Sandbox Code Playgroud)