2017-08-28 74 views
0

我作出了離開應用模塊,我得到了「用戶有沒有屬性」錯誤「用戶」對象有沒有屬性「假」

models.py

from django.db import models 
    from django.contrib.auth.models import User; 
    from django.db.models.signals import post_save 
    from django.dispatch import receiver 
    LEAVE_CHIOCE = (
    ('casual', 'Casual Leave'), 
    ('vacation', 'Vacation Leave'), 
    ('commuted', 'Commuted Leave'), 
    ('special_casual', 'Special Casual Leave'), 
    ('restricted', 'Restricted Leave'), 
    ('st 

ation', 'Station Leave'), 
    ) 

    APPLICATION_STATUSES = (

    ('accepted', 'Accepted'), 
    ('rejected', 'Rejected'), 
    ('processing', 'Being Processed') 

    ) 
    class Leave(models.Model): 
     user = models.OneToOneField(User,related_name='applied_for', on_delete=models.CASCADE); 
     leave_type = models.CharField(max_length=20, choices=LEAVE_CHIOCE); 
     applied_time = models.DateTimeField(auto_now = True); 
     start_date = models.DateField(); 
     end_date = models.DateField(); 
     purpose = models.CharField(max_length=500, blank=True); 
     leave_address = models.CharField(max_length=100, blank=True); 
     processing_status = models.CharField(max_length=20, choices=APPLICATION_STATUSES); 

    @receiver(post_save, sender=User) 
    def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      Leave.objects.create(user=instance) 

    @receiver(post_save, sender=User) 
    def save_user_profile(sender, instance, **kwargs): 
     instance.leave.save() 

forms.py

from django import forms; 
from . models import Leave, ApplicationRequest, RemainingLeaves; 
from django.contrib.auth.models import User; 
from django.contrib.auth.forms import UserCreationForm; 
from datetime import datetime 


class UserForm(forms.ModelForm): 
    class Meta: 
     model = User; 
     fields = ('username', 'first_name', 'last_name', 'email'); 

class LeaveForm(forms.ModelForm): 
    model = Leave; 
    class Meta: 
     fields = ('leave_type', 'start_date', 'end_date', 'purpose', 'leave_address'); 

view.py

from __future__ import unicode_literals 
from django.contrib.auth.models import PermissionsMixin 
from django.shortcuts import render 
from django.http import HttpResponse; 
from . models import Leave, ApplicationRequest, RemainingLeaves; 
from django.contrib.auth.decorators import login_required; 
from . forms import LeaveForm, UserForm; 
from django.db import transaction 
from django.contrib.auth.models import User 
import os; 


# Create your views here. 
@login_required(login_url='/login') 
@transaction.atomic 
def getLeaveTemplate(request): 
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))); 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user); 
     leave_form = LeaveFor[enter image description here][1]m(request.POST, instance=request.user.leave) 

     if user_form.is_valid() and leave_form.is_valid(): 
      user_form.save(); 
      leave_form.save(); 
      return HttpResponse("Thanksss"); 
    else: 
     user_form = UserForm(instance=request.user); 
     leave_form = LeaveForm(instance=request.user.leave); 
    return render(request, BASE_DIR+"/templates/pages/leaveform.html", {'user_form':user_form}); 
+3

嘗試改變'request.user.leave'到'request.user.applied_for'。這就是你將'related_name'指定在'OneToOneField'中。 – ikkuh

+0

發表在答案部分,所以可以接受它 –

回答

1

在Django文檔中描述的:

從相關對象返回到這個關係的名稱。

您在聲明related_nameapplied_for以下行:

user = models.OneToOneField(User, related_name='applied_for', on_delete=models.CASCADE) 

這意味着Leave對象將具有用於獲取相關User對象的屬性user。要從User對象轉到相關的Leave對象,則會添加屬性[related_name]。這是你的情況applied_for。要刪除您的錯誤,只需將每個request.user.leave更改爲request.user.applied_for

爲了將applied_for屬性更改爲leave可以定義更改爲以下:

user = models.OneToOneField(User, related_name='leave', on_delete=models.CASCADE) 

related_name是一個可選參數,它有一個非常有用default value

如果你不爲OneToOneField指定related_name參數,Django將使用當前模型的小寫名稱作爲默認值。

所以你的情況不提供一個默認值將增加該屬性leaveUser對象

# in model 
user = models.OneToOneField(User, on_delete=models.CASCADE) 

# in view 
request.user.leave 
相關問題