【发布时间】:2017-11-07 20:58:41
【问题描述】:
我有一个模型:
class Alert(models.Model):
entity = models.ForeignKey(Entity, on_delete=models.CASCADE, db_column='entity')
user = models.CharField(max_length=12)
#...More Fields
def __str__(self):
return '%s' % self.entity
我有一个对应的model form和crispy-forms渲染的model formset:
class AlertForm(ModelForm):
class Meta:
model = Alert
fields = '__all__'
widgets = {
'user': HiddenInput(),
'entity': ModelSelect2(url='eda', attrs={'data-minimum-input-length': 2}),
AlertFormSet = modelformset_factory(Alert, extra=1, exclude=(), form=AlertForm)
我有一个基于表单集的视图:
def alerts(request):
helper = AlertFormsetHelper()
if request.method == 'POST':
formset = AlertFormSet(request.POST)
for form in formset:
if form.is_valid():
if form.has_changed():
if form.is_valid():
form.save()
entity = form.cleaned_data['entity']
messages.success(request, 'SUCCESS: Alert for %s was dispositioned' % entity)
return redirect('alerts')
else:
query = Alert.objects.filter(disposition='')
paginator = Paginator(query, 12)
page = request.GET.get('page')
try:
objects = paginator.page(page)
except PageNotAnInteger:
objects = paginator.page(1)
except EmptyPage:
objects = paginator.page(paginator.num_pages)
page_query = query.filter(id__in=[object.id for object in objects])
formset = AlertFormSet(queryset=page_query.order_by('entity'))
context = {'objects':objects, 'formset':formset, 'helper':helper}
return render(request, 'alerts/alerts.html', context)
我希望user 由当前REMOTE_USER 用户名填充,该用户名可以通过request.user.get_username() 访问。 user.get_username 在我的模板中正确执行并显示当前用户。但是,当我尝试自动填充字段并将数据发布到数据库时,记录不会发布。我尝试将视图更改为:
def alerts(request):
helper = AlertFormsetHelper()
if request.method == 'POST':
formset = AlertFormSet(request.POST)
for form in formset:
if form.is_valid():
if form.has_changed():
if form.is_valid():
form.save()
entity = form.cleaned_data['entity']
user = request.user.get_username()
messages.success(request, 'SUCCESS: Alert for %s was dispositioned' % entity)
return redirect('alerts')
我尝试创建一个正在保存的表单的新实例,应用用户操作,然后保存该实例。这也没有任何结果。
在将表单集中的表单保存到数据库之前,我应该如何访问当前用户并自动填充一个空白的隐藏字段?
Formset 保存更新:
if request.method == 'POST':
formset = AlertFormSet(request.POST)
if formset.is_valid():
formset.instance.user = request.user.get_username()
formset.save()
entity = formset.cleaned_data['entity']
messages.success(request, 'SUCCESS: Alert for %s was dispositioned' % entity)
第二个表单集保存更新:
if request.method == 'POST':
formset = AlertFormSet(request.POST)
if formset.is_valid():
instances = formset.save(commit=False)
for instance in instances:
instance.user = request.user.get_username()
instance.entity = instance.cleaned_data['entity']
instance.save()
messages.success(request, 'SUCCESS: Alert for %s was dispositioned' % entity)
【问题讨论】:
-
您可以使用
formset.save()(也许使用commit=False)稍微简化您的视图。您可以访问formset.changed_objects,因此您不必为每个表单检查form.has_changed()。 -
我最近几次尝试并未能完成此调整...如果您对我尝试更新我的问题有任何想法,请告诉我。否则我可以发布一个新问题。
-
设置
formset.instance将不起作用,您需要更改单个表单或实例。您的第二次尝试看起来是正确的。你不需要做instance.entity = instance.cleaned_data['entity']-instance.entity应该已经设置好了。 -
仍然会导致重定向而不向数据库提交任何内容。我会继续挖掘 - 非常感谢你的帮助
-
您可能会得到奇怪的结果,因为您正在为 GET 请求而不是 POST 请求指定表单。这意味着对于发布请求,查询集默认为
Alert.objects.all(),并且表单集无效,因为有很多表单“丢失”。请注意,通常的方法是在表单集无效时显示错误(这样更容易调试),并且仅在提交有效表单集时才重定向。
标签: python django python-3.x django-models django-views