使用 django-tables2 表单将选择发送到另一个表单 - 什么都没有保存?
Using django-tables2 form to send selection to another form - nothing saves?
我有一个 django-tables2 表单,可以将选定的模型项传递给第二个表单。第二种形式的目标是允许用户编辑将应用于所有项目的值。我的问题是第二个表单验证失败,然后输入值没有被保存。我如何 link 这两个表单并在表单尝试验证之前允许用户输入? POST 请求似乎是从 table 到第二种形式——有没有办法中断它或开始第二个请求?
image_list.html:
<form method="post" action="{% url 'ExifReader:delete_image_list' %}">
{% render_table table %}
{% csrf_token %}
<button type="submit" style="margin-right:10px" class="btn btn-primary" name="edit_FAN">Edit Exif</button>
<button type="submit" style="margin-right:10px" class="btn btn-danger" onclick="return confirm('Delete?')" name="delete_images">Delete Images</button>
</form>
注意:delete_images
按钮工作正常。
views.py:
def delete_image_list(request):
if request.method == 'POST':
if 'delete_images' in request.POST:
pks = request.POST.getlist('selection')
# Delete items...
elif 'edit_FAN' in request.POST:
form = EditFANForm()
pks = request.POST.getlist('selection')
imgs = []
for pk in pks:
ex = exif.objects.get(pk=pk)
imgs.append(ex.image_id)
if request.method == 'POST':
print('POST')
for img in imgs:
print(image.objects.get(pk=img))
form = EditFANForm(instance=image.objects.get(pk=img))
if form.is_valid():
print('Valid')
formS = form.save(commit=False)
img.FAN = formS.FAN
fromS.save()
else:
print('ERRORS: ', form.errors)
return render(request, 'ExifReader/edit_fan_form.html', {'form': form, 'pks':pks})
当我从 table 视图中单击 "edit_FAN" 按钮时,EditFANForm
正确呈现,我可以输入值,然后重定向回 table 视图, 但是 none 的值被保存了。从我添加的用于跟踪代码的 print
命令中,我在控制台中得到以下内容:
POST
774
ERRORS: <bound method BaseForm.non_field_errors of <EditFANForm bound=False, valid=False, fields=(FAN;collection;tags)>>
其中“774”是所选对象。
所以在我看来表单到达可以编辑值的部分(EditFANForm
),但是在用户可以输入值之前表单 POSTs,因此表单不验证(但是也没有任何错误?)。
我哪里错了?如何保存第二种形式的值?
Python 3.6.8,Django 2.2.6
我找到了一个似乎工作正常的解决方案:添加到另一个视图的重定向以处理第二种形式。来自 django.contrib
的消息用于将上下文数据传递到第二个视图和表单(在本例中是来自 table 的选定对象)。
from django.contrib import messages
def delete_image_list(request):
...
elif 'edit_FAN' in request.POST:
pks = request.POST.getlist('selection')
messages.add_message(request, messages.INFO, pks)
return HttpResonseRedirect(reverse('ExifReader:images_list_edit'))
def images_list_edit(request):
if request.method == 'POST':
...
我有一个 django-tables2 表单,可以将选定的模型项传递给第二个表单。第二种形式的目标是允许用户编辑将应用于所有项目的值。我的问题是第二个表单验证失败,然后输入值没有被保存。我如何 link 这两个表单并在表单尝试验证之前允许用户输入? POST 请求似乎是从 table 到第二种形式——有没有办法中断它或开始第二个请求?
image_list.html:
<form method="post" action="{% url 'ExifReader:delete_image_list' %}">
{% render_table table %}
{% csrf_token %}
<button type="submit" style="margin-right:10px" class="btn btn-primary" name="edit_FAN">Edit Exif</button>
<button type="submit" style="margin-right:10px" class="btn btn-danger" onclick="return confirm('Delete?')" name="delete_images">Delete Images</button>
</form>
注意:delete_images
按钮工作正常。
views.py:
def delete_image_list(request):
if request.method == 'POST':
if 'delete_images' in request.POST:
pks = request.POST.getlist('selection')
# Delete items...
elif 'edit_FAN' in request.POST:
form = EditFANForm()
pks = request.POST.getlist('selection')
imgs = []
for pk in pks:
ex = exif.objects.get(pk=pk)
imgs.append(ex.image_id)
if request.method == 'POST':
print('POST')
for img in imgs:
print(image.objects.get(pk=img))
form = EditFANForm(instance=image.objects.get(pk=img))
if form.is_valid():
print('Valid')
formS = form.save(commit=False)
img.FAN = formS.FAN
fromS.save()
else:
print('ERRORS: ', form.errors)
return render(request, 'ExifReader/edit_fan_form.html', {'form': form, 'pks':pks})
当我从 table 视图中单击 "edit_FAN" 按钮时,EditFANForm
正确呈现,我可以输入值,然后重定向回 table 视图, 但是 none 的值被保存了。从我添加的用于跟踪代码的 print
命令中,我在控制台中得到以下内容:
POST
774
ERRORS: <bound method BaseForm.non_field_errors of <EditFANForm bound=False, valid=False, fields=(FAN;collection;tags)>>
其中“774”是所选对象。
所以在我看来表单到达可以编辑值的部分(EditFANForm
),但是在用户可以输入值之前表单 POSTs,因此表单不验证(但是也没有任何错误?)。
我哪里错了?如何保存第二种形式的值?
Python 3.6.8,Django 2.2.6
我找到了一个似乎工作正常的解决方案:添加到另一个视图的重定向以处理第二种形式。来自 django.contrib
的消息用于将上下文数据传递到第二个视图和表单(在本例中是来自 table 的选定对象)。
from django.contrib import messages
def delete_image_list(request):
...
elif 'edit_FAN' in request.POST:
pks = request.POST.getlist('selection')
messages.add_message(request, messages.INFO, pks)
return HttpResonseRedirect(reverse('ExifReader:images_list_edit'))
def images_list_edit(request):
if request.method == 'POST':
...