2017-12-24 17 views
0

안녕 내 개인 키에 문제가 있습니다. 누군가가 나에게 손을 댈 수 있다면 큰 문제가 될지 모르겠다.보기를 호출해야 할 때 PK를 관리하는 방법

내가 얻을 errror은 다음과 같습니다

class Team(models.Model): 
    team_name = models.CharField(max_length=100, default = '') 
    team_hr_admin = models.ForeignKey(MyUser, blank=True, null=True) 
    members = models.ManyToManyField(MyUser, related_name="members") 

    def __str__(self): 
     return self.team_name 


class Project(models.Model): 
    name = models.CharField(max_length=250) 
    team_id = models.ForeignKey(Team, blank=True, null=True) 
    project_hr_admin = models.ForeignKey('registration.MyUser', blank=True, null=True) 
    candidat_answers = models.ManyToManyField('survey.response') 

    def get_absolute_url(self): 
     return reverse('website:ProjectDetails', kwargs = {'pk1' : self.pk}) 

    def __str__(self): 
     return self.name 

내보기 :

class HomePage(TemplateView): 
    template_name= 'index.html' 

class LinkTeam(generic.ListView): 
    template_name = 'link_project.html' 

    def get_queryset(self): 
     #import pdb; pdb.set_trace() 
     #team2 = Team.objects.all().filter(team_hr_admin = self.request.user) 
     queryset = Team.objects.filter(team_hr_admin=self.request.user) 
     return queryset 

def TeamSelect(request): 
    import pdb; pdb.set_trace() 
    if request.method == "POST": 
     select_form = EditSelectTeam(request.user, request.POST) 
     if select_form.is_valid(): 
      data = select_form.cleaned_data['team_choice'] 
      obj2 = Project.objects.filter(project_hr_admin=request.user) 
      obj3 = obj2.latest('id') 
      if obj3.team_id == None: 
       obj3.team_id = data 
       obj3.save() 
       obj4 = obj3.team_id 
       obj5 = obj4.members.all() 

       for i in obj5: 
        current_site = get_current_site(request) 
        message = render_to_string('acc_join_email.html', { 
         'user': i.first_name, 
         'domain':current_site.domain, 
         }) 
        mail_subject = 'You have been invited to SoftScores.com please LogIn to get access to the app' 
        to_email = i.email 
        email = EmailMessage(mail_subject, message, to=[to_email]) 
        email.send() 
       messages.success(request, 'test') 
       return HttpResponseRedirect(reverse('website:ProjectDetails', kwargs={'pk1':obj3.id})) 
      else: 
       print('this project has already a team') 
     else: 
      print('Non Valid form') 

    else: 
     select_form = EditSelectTeam(request.user) 
    return render(request,'link_project.html', 
          {'select_form':select_form }) 

class HRIndex(generic.ListView): 
    #import pdb; pdb.set_trace() 
    template_name = "HR_index.html" 
    model = Project 

class CandidateIndex(TemplateView): 
    #import pdb; pdb.set_trace() 
    template_name = "candidate_index.html" 

class EmployeeIndex(TemplateView): 
    #import pdb; pdb.set_trace() 
    template_name = "employee_index.html" 

    def get_context_data(self, **kwargs): 
     context = super(EmployeeIndex, self).get_context_data(**kwargs) 
     surveys = Survey.objects.filter(is_published=True) 
     if not self.request.user.is_authenticated(): 
      surveys = surveys.filter(need_logged_user=False) 
     context['surveys'] = surveys 
     return context 

class ProjectCreate(CreateView, LoginRequiredMixin): 
    model = Project 
    fields = ['name'] 
    template_name = 'project_form.html' 

    def form_valid(self, form): 
     form.instance.project_hr_admin = self.request.user 
     return super(ProjectCreate, self).form_valid(form) 

class ProjectDetailView(generic.DetailView, LoginRequiredMixin): 
    #import pdb; pdb.set_trace() 
    model = Project 
    template_name = 'project_details.html' 

    def get_context_data(self, **kwargs): 
     context = super(ProjectDetailView, self).get_context_data(**kwargs) 
     try: 
      team_name = Project.objects.get(id=self.kwargs['pk1']).team_id.members.all() 
      context['team_name'] = team_name 
     except AttributeError: 
      pass 
     return context 

class EmployeeDetailView(generic.DetailView, LoginRequiredMixin): 
    #import pdb; pdb.set_trace() 
    model = MyUser 
    template_name = 'Employee_Details.html' 


    def get_object(self, queryset=None): 
     return get_object_or_404(MyUser, pk=self.kwargs['pk2'], members__project=self.kwargs['pk1']) 

    def get_context_data(self, **kwargs): 
     context = super(EmployeeDetailView, self).get_context_data(**kwargs) 
     employee_name = MyUser.objects.get(id=self.kwargs['pk2']) 
     team_list = Project.objects.get(id=self.kwargs['pk1']).team_id.members.all() 
     team_list_pop = Project.objects.get(id=self.kwargs['pk1']).team_id.members.all().exclude(id=self.kwargs['pk2']) 
     context={ 
      'employee_name' : employee_name, 
      'team_list' : team_list, 
      'team_list_pop' : team_list_pop 
     } 
     return context 

class TeamCreate(CreateView): 

    model = Team 
    fields = ['team_name'] 
    template_name = 'team_form.html' 

    def form_valid(self, form): 
     #import pdb; pdb.set_trace() 
     valid = super(TeamCreate, self).form_valid(form) 
     form.instance.team_hr_admin = self.request.user 
     obj = form.save() 
     #SELECT * FROM project WHERE user = 'current_user' AND team_id = NULL 
     obj2 = Project.objects.get(project_hr_admin=self.request.user, team_id=None) 
     obj2.team_id = obj 
     obj2.save() 
     return valid 
     return super(TeamCreate, self).form_valid(form) 

    def get_success_url(self): 
     #import pdb; pdb.set_trace() 
     project = Project.objects.get(team_id=None, project_hr_admin=self.request.user) 
     return project.get_absolute_url() 
일반 상세보기 ProjectDetailView는

내 모델은 다음과 같습니다 객체 PK 또는 슬러그 중 하나를 호출해야

내 URL을 :

urlpatterns = [ 
    url(r'^hr_index/$', views.HRIndex.as_view(), name='hr_index'), 
    url(r'^candidate_index/$', views.CandidateIndex.as_view(),name='candidate_index'), 
    url(r'^employee_index/$', views.EmployeeIndex.as_view(),name='employee_index'), 
    url(r'^addproject/$', views.ProjectCreate.as_view(), name='add_project'), 
    url(r'^project/(?P<pk1>[0-9]+)/addteam/$', views.TeamCreate.as_view(), name='add_team'), 
    url(r'^project/(?P<pk1>[0-9]+)/linkteam/$', views.LinkTeam.as_view(), name='link_team'), 
    url(r'^project/(?P<pk1>[0-9]+)/linkteam2/$', views.TeamSelect, name='team_select'), 
    url(r'^project/(?P<pk1>[0-9]+)/$',views.ProjectDetailView.as_view(), name='ProjectDetails'), 
    url(r'^project/(?P<pk1>[0-9]+)/api/chart/data2/$',views.TeamChartData.as_view(), name='TeamChartData'), 
    url(r'^project/(?P<pk1>[0-9]+)/(?P<pk2>[0-9]+)/$',views.EmployeeDetailView.as_view(), name='EmployeDetails'), 
    url(r'^project/(?P<pk1>[0-9]+)/(?P<pk2>[0-9]+)/api/chart/data/$',views.EmployeeChartData.as_view(), name='EmployeeChartData'), 

나는 무엇을 여기에서 엉망 이냐?

답변

2

DetailView 님의 get_object 메서드는 pk url 인자를 찾고 있습니다. pk1 URL 인수 만 있기 때문에 오류가 발생합니다.

url(r'^project/(?P<pk>[0-9]+)/$',views.ProjectDetailView.as_view(), name='ProjectDetails') 

을하거나 EmployeeDetailView에서했던 것처럼 get_object 메소드를 오버라이드 (override) : 당신은 pk에 URL의 인수 이름을 변경해야합니다.

당신은 또한이 같은 ProjectDetailView 내부 pk_url_kwarg을 정의하기 위해 시도 할 수 있습니다 : 당신이 URL 패턴을 변경하거나 get_object을 재정의 할 필요가 없습니다이 경우

class ProjectDetailView(generic.DetailView, LoginRequiredMixin): 
    #import pdb; pdb.set_trace() 
    model = Project 
    template_name = 'project_details.html' 
    pk_url_kwarg = 'pk1' 

합니다.

+1

thx men! overodget_object;) – Ben2pop

+0

이제 TeamSelect에서 예기치 않은 키워드 인수 'pk1'을 얻었습니다. – Ben2pop

+0

@ Ben2pop 함수 기반 뷰의 경우 url의 인수를 함수 인수로 정의해야합니다 (예 : def TeamSelect (request, pk1 = None) :'). TeamSelect 함수에'pk1' 인수를 추가하기 만하면됩니다. – neverwalkaloner