2017-08-28 2 views
0

Je fais un module de demande d'autorisation et je suis arrivé erreurs « utilisateur n'a pas d'attribut »« utilisateur » n'a pas d'attribut « congé »

de 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

Essayez de changer '' request.user.leave' à request.user.applied_for'. C'est ce que vous avez spécifié 'related_name' pour être dans' OneToOneField'. – ikkuh

+0

poste dans la section des réponses, donc peut l'accepter –

Répondre

1

related_name décrit dans la documentation Django:

Le nom à utiliser pour la relation de l'objet associé à celui-ci.

Vous déclarez le related_name être applied_for sur la ligne suivante:

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

Cela signifie qu'un objet Leave aura la propriété user qui est utilisé pour obtenir le objectale User. Pour passer d'un objet User à l'objet Leave associé, la propriété [related_name] est ajoutée. C'est dans votre cas applied_for. Pour supprimer vos erreurs, changez simplement chaque request.user.leave en request.user.applied_for.

Pour changer la propriété applied_for à leave vous pouvez modifier la définition de ce qui suit:

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

Mais le related_name est un argument optionnel et il a un utile default value:

Si vous ne spécifiez pas l'argument related_name pour OneToOneField, Django utilisera le nom en minuscule du modèle actuel comme valeur par défaut.

Donc, dans votre cas ne pas fournir une valeur par défaut ajoutera la propriété leave à User objets

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

# in view 
request.user.leave