我有一个上传仪表板,显示用户文件。文件由模型表示,仪表板有一个视图,删除操作有第二个视图。
以下是文件上传和相关模型客户端的模型:
@python_2_unicode_compatible
class ClientUpload(models.Model):
client = models.ForeignKey(Client)
created_at = models.DateTimeField(auto_now_add=True)
file_upload = models.FileField(upload_to=generate_filename)
def __str__(self):
return self.client.company
class Meta:
verbose_name_plural = _("Client Uploads")
verbose_name = _("Client Upload")
@python_2_unicode_compatible
class Client(models.Model):
user = models.OneToOneField(User)
company = models.CharField(max_length=100)
def __str__(self):
return self.company
class Meta:
verbose_name_plural = _("Clients")
verbose_name = _("Client")
permissions = (
("can_upload", _("Can upload files.")),
("can_access_uploads", _("Can access upload dashboard.")),
("is_client", _("Is a client.")),
)
以下是delete
视图的网址格式:
url(r'^dashboard/delete/(?P<upload_id>\d+)$', views.dashboard_delete, name='dashboard-delete'),
以下是仪表板和仪表板删除操作的视图:
def dashboard_delete(request, upload_id):
p = get_object_or_404(ClientUpload, pk=upload_id)
p.delete()
return HttpResponseRedirect(reverse('dashboard'))
@login_required(login_url='/dashboard-login/')
def dashboard(request):
current_user = request.user
current_client = request.user.client
files = ClientUpload.objects.filter(client=current_client)
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
dz_files = request.FILES.getlist('file_upload')
for f in dz_files:
new_file = ClientUpload(client=current_client, file_upload=f)
new_file.save()
logger = logging.getLogger(__name__)
logger.info("File uploaded from " + current_client.company)
else:
logger = logging.getLogger(__name__)
logger.warning("Upload Failed")
return HttpResponseRedirect(reverse('dashboard'))
else:
form = UploadFileForm()
data = {'form': form, 'client': current_client, 'files': files}
return render_to_response('dashboard.html', data, context_instance=RequestContext(request))
最后是文件列表的模板部分,其中调用了dashboard-delete视图:
<table class="table">
<tr>
<th>{% blocktrans %}Filename{% endblocktrans %}</th>
<th>{% blocktrans %}Size (Bytes){% endblocktrans %}</th>
<th>{% blocktrans %}Upload Time{% endblocktrans %}</th>
<th>{% blocktrans %}Actions{% endblocktrans %}</th>
</tr>
{% for file in files %}
{% with uploaded_file=file.file_upload %}
<tr>
<th>{{ uploaded_file.name|pathend }}</th>
<th>{{ uploaded_file.size }}</th>
<th>{{ file.created_at }}</th>
<th><a href="{{ uploaded_file.url }}" id="view-btn"><i class="fa fa-search"></i></a><a href="{% url 'dashboard-delete' file.id %}"><i class="fa fa-trash-o"></i></a></th>
{% endwith %}
{% endfor %}
</tr>
</table>
在操作中,有一个带有锚点的图标 - 删除名为url的仪表板。我传入当前文件ID。然后在url.py文件中我将它传递给正则表达式。然后视图查找并删除该文件。我使用get_object_or_404()
并且没有获得404,但页面只刷新并且没有删除任何内容。出于某种原因,当我按下删除图标时,我得到两个请求/ dashboard / delete / 5(5个将是该文件的upload_id)而不是一个。
任何帮助都会非常感激,为什么我的模型没有被删除,页面重新加载就是这样。我找不到有什么不对。我尝试使用catch重定向和dj调试工具栏,但它没有从仪表板删除视图捕获重定向回仪表板。这没有任何意义,通常会抓住重定向。
如果您需要更多信息或需要查看更多代码,请告诉我,我会发布,但您应该拥有所需的信息。我已经被困在这里一个星期,所以我真的可以用一些帮助来最终完成他的工作。
我知道ID是正确的,因为它们在管理面板中是相同的数字,当我将鼠标悬停在上面时,我会看到每个项目的ID,并且它们与管理面板的ID对齐。我也尝试过做{% url 'dashboard-delete' upload_id=file.id %}
并且它也没有用,我认为无论如何我不认为它是一个kwarg。
我完全被困在这里。我已经多次完成这个确切的方法并且它一直有效。我错过了什么?
编辑:
经过进一步的测试,看起来这个视图从来没有被调用过,这没有任何意义。当我将鼠标悬停在链接上时,我会获得正确的URL,但视图永远不会被调用。我在顶部放了一条记录线,它永远不会发生。为什么会这样?什么会导致它不被称为?
注意到视图似乎根本没有被调用。我甚至无法从第一行的内部执行日志语句。为什么会这样?之前我使用过相同的删除视图,我甚至尝试过使用DeleteView的CBV。
答案 0 :(得分:0)
我必须在urlpatterns上移动我的/ dashboard / delete / / dashboard,我知道这一点并且已经忘记了。现在工作。愚蠢的我。