/ employee /“函数”对象中的AttributeError没有属性“删除”

时间:2020-01-17 04:33:51

标签: python django

我是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 %}

2 个答案:

答案 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()

然后它将起作用。