2017-05-26 5 views
0

Ich habe eine Django-App, mit der jeder registrierte Benutzer Kategorien erstellen kann. Für die Authentifizierung verwende ich django-all-auth. Mein models.py sieht wie folgt aus:Wie übergebe ich einen authentifizierten Benutzer an forms.py in django

class Profile(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    create_date = models.DateTimeField('date added', auto_now_add=True) 
    modify_date = models.DateTimeField('date modified', default=timezone.now) 

class Category(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    user = models.ForeignKey(Profile, on_delete=models.CASCADE) 
    name = models.CharField(max_length=200, unique=True) 
    create_date = models.DateTimeField('date added', auto_now_add=True) 
    modify_date = models.DateTimeField('date modified', default=timezone.now) 

auf der Indexseite der Benutzer die erstellten Kategorien sehen und neue zu schaffen. Die views.py:

def CategoryView(request): 
    user = 0 
    if request.user.is_authenticated(): 
     user = request.user 
    form = CategoryNameForm() 
    form.user = user 
    context = { 
     'categories': Category.objects.all(), 
     'form': form, 
     'user':user, 
     } 
    if request.method == 'POST': 
     form = CategoryNameForm(request.POST) 
     form.user = user 
     if form.is_valid(): 
      form.save() 
    return render(request, 'myapp/index.html',context) 

forms.py: Klasse CategoryNameForm (forms.ModelForm):

class Meta: 
     model = Category 
     fields = ('name',) 

Die Authentifizierung funktioniert. So wurde ich denke nur passieren legt das Benutzerfeld in das Formular:

class CategoryNameForm(forms.ModelForm): 

     class Meta: 
      model = Category 
      fields = ('name','user',) 

es verstecken und dann, nur wählen Sie es über JS, da der Benutzer im Kontext ist. Ich habe mich nur gefragt, ob es einen einfacheren Weg gibt. Diese form.user = user aus irgendeinem Grund nicht funktioniert hat, erhalte ich eine NOT NULL Ausfall

+0

also möchten Sie sicherstellen, dass nur eingeloggte Benutzer zugreifen können? Wie wäre es mit '@ login_required' in der Datei view.py? – hansTheFranz

Antwort

1

Es gibt mehrere Möglichkeiten, aber hier ist eine:

class CategoryNameForm(forms.ModelForm): 
    class Meta: 
     model = Category 
     fields = ('name',) # take out user you don't need it here 

    def save(self, **kwargs): 
     user = kwargs.pop('user') 
     instance = super(CategoryNameForm, self).save(**kwargs) 
     instance.user = user 
     instance.save() 
     return instance 

Dann im Blick:

if form.is_valid(): 
    form.save(user=request.user, commit=False) 

Fabrikat sicher, dass Ihre nur für authentifizierte Benutzer zugänglich ist. Andernfalls erhalten Sie weiterhin NOT NULL-Constraint-Fehler für den Benutzer.

+0

das funktionierte, perfekt danke, ich musste diese Zeile jedoch zu 'instance.user = Profile.objects.get (user = user)' – Tom

+1

Ja richtig, wurde durch Ihre Namenskonvention verwirrt :) PS können Sie auch nur tun ' instance.user = user.profile' –

+0

es ist ziemlich schrecklich, irgendeinen Ratschlag, wo ich bessere Namenskonventions lernen könnte? – Tom

Verwandte Themen