Ove*_*ass 2 python django django-models django-views python-3.x
我有一个模型:
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
Run Code Online (Sandbox Code Playgroud)
我有一个由 Crispy-Forms 渲染的相应模型表单和模型表单集:
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)
Run Code Online (Sandbox Code Playgroud)
我有一个建立在表单集之上的视图:
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)
Run Code Online (Sandbox Code Playgroud)
我希望由可以通过 访问的user当前用户名填充。在我的模板中正确执行并显示当前用户。但是,当我尝试自动填充字段并将数据发布到数据库时,记录未发布。我尝试将视图更改为:REMOTE_USERrequest.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')
Run Code Online (Sandbox Code Playgroud)
我尝试创建要保存的表单的新实例,应用用户操作,然后保存该实例。这也没有结果。
在将表单集中的表单保存到数据库之前,我应该如何访问当前用户并自动填充空白的隐藏字段?
表单集保存更新:
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)
Run Code Online (Sandbox Code Playgroud)
第二个表单集保存更新:
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)
Run Code Online (Sandbox Code Playgroud)
我认为你不需要在这里隐藏输入。我会使用不包含用户字段的表单。
class AlertForm(ModelForm):
class Meta:
model = Alert
fields = ['entity', ...] . # don't include user
...
Run Code Online (Sandbox Code Playgroud)
然后在您看来,您可以form.instance.user在保存表单之前进行设置。
if form.is_valid():
form.instance.user = request.user.get_username()
form.save()
Run Code Online (Sandbox Code Playgroud)