我是python和django的新手,想添加一个删除雇员的函数,以及url和html,删除按钮就很好了,但是它什么也没做,我做错了什么吗? ,我一直在研究,但找不到解决方案,请提出建议,谢谢,这是代码:
views.py
from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect, Http404
from django.urls import reverse
from django.contrib.auth.decorators import login_required
from django.forms import modelformset_factory
from .models import Employee
from .forms import EmployeeForm
def index(request):
'''The home page for employee_record.'''
return render(request, 'employee_records/base.html')
@login_required
def employees(request):
'''Shows all employees'''
employees = Employee.objects.filter(owner=request.user).order_by('full_name')
context = {'employees': employees}
return render(request, 'employee_records/employees.html', context)
@login_required
def employee(request, employee_id):
'''Show a single employee'''
employee = Employee.objects.get(id=employee_id)
# Make sure the employee belongs to the current user.
if employee.owner != request.user:
raise Http404
EmployeeFormSet = modelformset_factory(Employee, fields=('full_name',
'address', 'city', 'state', 'zip', 'email', 'hire_date'), extra=0)
if request.method == 'POST':
form = EmployeeFormSet(request.POST)
employees = form.save(commit=False)
for employee in employees:
employee.save()
return HttpResponseRedirect(reverse('employee_records:employees'))
form = EmployeeFormSet(queryset=Employee.objects.filter(id=employee_id))
context = {'employee': employee, 'form' : form}
return render(request, 'employee_records/employee.html', context)
@login_required
def delete_employee(request):
employee
employee.delete()
return redirect('employees')
urls.py
'''Defines URL patterns for employee_records.'''
from django.urls import path
from . import views
app_name = 'employee_records'
urlpatterns = [
# Home page
path('', views.employees, name='employees'),
# Detail page for a single employee
path('employees/<int:employee_id>/', views.employee, name='employee'),
# Detail page for delete a single employee
path('employee/', views.delete_employee, name='delete_employee'),
# Page for adding a new employee
path('new_employee/', views.new_employee, name='new_employee'),
]
employee.html
{% extends 'employee_records/employees.html' %}
{% load bootstrap3 %}
{% block content %}
{% if employee %}
<form method='POST'>
{% csrf_token %}
{{ form.as_p}}
{% buttons %}
<button input type='submit' class="btn btn-primary">submit</button>
{% endbuttons %}
</form>
<a href="{% url 'employee_records:delete_employee' %}">
{% buttons %}
<button input type='delete' class="btn btn-danger">delete</button>
{% endbuttons %}
</a>
{% endif %}
{% endblock content %}
答案 0 :(得分:2)
我认为您对 employee
中的 scope
感到困惑。在您的删除视图中,员工不引用查询集或模型。而是引用 员工视图 ,这是一个函数,因此会出现错误。要解决此问题,您将需要直接在delete_employee
视图中执行查询,这意味着您必须将ID传递给视图(就像在员工视图中一样):
@login_required
def delete_employee(request, employee_id):
employee = Employee.objects.get(id=employee_id)
employee.delete()
return redirect('employees')
请不要忘记为此视图更改您的path
,以便将employee_id
传递给您的视图:
path('delete_employee/<int:employee_id>', views.delete_employee, name='delete_employee'),
范围的概念非常重要,因此我建议您对此主题进行一些研究。
答案 1 :(得分:1)
问题出在您的此代码块中:
@login_required
def delete_employee(request):
employee
employee.delete()
return redirect('employees')
employee
不是对象。
您首先必须获取该特定employee
的对象,然后才能删除。
赞:
employee_id = request.POST.get('employee_id')
# or
employee_id = request.GET.get('employee_id')
# whatever the way of sending employee_id
然后:
employee = Employee.objects.get(id=employee_id)
employee.delete()
然后它将起作用。