我遇到的问题是我尝试创建一个表单,通过将当前登录的用户ID嵌入到ModelForm的隐藏字段中来传递该表单。
我的模特:
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'
我的表格:
class PortfoliosCreateForm(ModelForm):
class Meta:
model = Portfolios;
我的模板:
<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>
我使用通用创建视图调用模板:
url(
r'^portfolios/create/$',
'django.views.generic.create_update.create_object',
dict(
form_class=PortfoliosCreateForm,
post_save_redirect='/',
template_name='portfolios/create.html'
)
),
如何在该表单中最好地嵌入用户ID,以便它通过隐藏字段?或者我应该简单地传入一个虚拟字段并在自定义保存函数中填入值?
编辑:用户模型是内置的Django用户模型。
由于
答案 0 :(得分: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
答案 1 :(得分:-3)
在通用视图中设置all并不是一个好习惯,因为:
form
类中的逻辑,这可能会增加约束漏洞,因此您可以将错误的数据保存到数据库中,如果您尝试在某个位置创建对象在通用视图外面,在我看来,更好的方法可能是:
class Book(models.Model):
# ...
author = models.ForeignKey(Author, related_name='books')
# ...
class BookForm(forms.ModelForm):
class Meta:
model = Book
# ...
widgets = {
'author': forms.HiddenInput(),
# ...
}
# ...
def create(request, author_id):
author = get_object_or_404(Author, pk=author_id)
form = BookForm(request.POST or None, initial={'author': author.id})
if request.method == "POST":
if form.is_valid():
form.save()
return redirect('/')
因此,这将允许您使用Django表单验证并具有IDs
的数据库约束,以确保您将有效数据放入数据库。