我有一个模特:
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
我有一个由crispy-forms呈现的相应模型表单和模型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)
我有一个建立在formset之上的视图:
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')
在我的模板中正确执行并显示当前用户。但是,当我尝试自动填充字段并将数据POST到数据库时,不会发布记录。我尝试将视图更改为:
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)
我尝试创建要保存的表单的新实例,应用用户操作,然后保存实例。这也没有任何结果。
在将表单中的表单保存到数据库之前,如何访问当前用户并自动填充空白的隐藏字段?
Formset保存更新:
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保存更新:
Person
答案 0 :(得分:3)
我认为你不需要隐藏输入。我会使用一个不包含用户字段的表单。
class AlertForm(ModelForm):
class Meta:
model = Alert
fields = ['entity', ...] . # don't include user
...
然后在您的视图中,您可以在保存表单之前设置form.instance.user
。
if form.is_valid():
form.instance.user = request.user.get_username()
form.save()