2016-10-28 4 views
0

Я ищу наиболее целесообразный метод для хранения имени пользователя, ответственного за отправку формы, чтобы я мог легко организовать формы, которые они отправили по своему имени пользователя, как «настройка учетной записи» для каждого пользователя.Сохраните пользователя, который отправил форму в ту же таблицу?

Я искал, но решение очень фрагментировано, и все сообщения об этом относятся к более старым версиям, а также лучшее решение, изменяющееся в каждой версии Django. Вероятно, это не помогает, что я все еще изучаю основы Django.

Вот мой views.py:

def add(request): 
    title = 'Add Reddit Account' 
    # ADD FORM 
    form = AddRedditForm(request.POST or None) 
    instance = form.save(commit=False) 
    instance.user = request.user 
    instance.save() 
    if request.method == "POST": 
     print(request.POST) 

    context = { 
     "form": form, 
     "title": title, 
     "user": instance.user 
    } 
    return render(request, "addreddit/add.html", context) 

и мой models.py:

from django.db import models 

class Account(models.Model): 
    user_name = models.CharField(max_length=20) 
    password = models.CharField(max_length=18) 
    secret = models.CharField(max_length=100) 
    tag = models.CharField(max_length=20, blank=True) 
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False) 
    user = models.ForeignKey('auth.User', null=True) 

    def __str__(self): #Python 3.3 is __str__ 
     return str(self.user) 
     return self.user_name 
     return self.password 
     return self.secret 
     return self.tag 
     return self.timestamp 

Наконец, forms.py в том случае, если это релевантно:

from django import forms 
from .models import Account 

class AddRedditForm(forms.ModelForm): 
    class Meta: 
     model = Account 
     fields = ['user_name','password','secret','tag'] 
    user_name = forms.CharField(required=True) 
    password = forms.CharField(widget=forms.PasswordInput,required=True) 
    secret = forms.CharField(required=True) 
    tag = forms.CharField(required=False) 

Возможно, это работает очень хорошо, кроме только вещь, сохраненная в форме, является пользователем, а не другой информацией.


рекомендуется редактировать:

from django.conf import settings 
from django.core.mail import send_mail 
from django.shortcuts import render, redirect 
from .forms import AddRedditForm 


# Create your views here. 
def add(request): 
    title = 'Add Reddit Account' 
    # ADD FORM 
    if request.method == "POST": 
     form = AddRedditForm(request.POST or None) 
     print(request.POST) 
     if form.is_valid(): 
      instance = form.save(commit=False) 
      instance.user = request.user 
      instance.save() 
      return redirect('addreddit/add') 

    context = { 
     "title": title, 
     "user": request.user, # not available if you haven't submitted the form 
     "form": form 
     } 
return render(request, "addreddit/add.html", context) 

ответ

0

Вы делаете много в этом представлении, чтобы сохранить данные формы, даже если метод запроса не является POST. В этом случае, когда вы делаете запрос GET, экземпляр формы сохраняется только с заполненным полем .user. Вы также не проверяете форму, которая является полезной встроенной функцией Django. Попробуйте это:

def add(request): 
    title = 'Add Reddit Account' 

    if request.method == 'POST': 
     form = AddRedditForm(request.POST) 
     if form.is_valid(): 
      instance = form.save(commit=False) 
      instance.user = request.user 
      instance.save() 
      return redirect('addreddit/add') # or whatever named URL this is 
    else: 
     form = AddRedditForm() 

    context = { 
     "form": form, 
     "title": title, 
     "user": instance.user # not available if you haven't submitted the form 
    } 
    return render(request, "addreddit/add.html", context) 

В запросе GET, instance.user даст ошибку имя. Я предполагаю, что это просто для отладки. В противном случае вы можете получить доступ к request.user.

Другая поправка, которую я предлагаю, является перенаправлением после POST, так что обновление страницы не случайно повторно передает форму. Получите это за счет импорта:

from django.shortcuts import redirect 
+0

Exception Значение: локальная переменная «форма», на который ссылается перед тем назначением - addreddit/views.py в оных, строка 21 - Благодаря, если заявление, форма не существует до логики и не может быть передан модели. –

+0

Хм. В обоих предложениях моей инструкции if-else присваивается 'form'. Вы вообще изменили это предложение? – nimasmi

+0

Какая строка выше соответствует вашей строке 21? – nimasmi

0

ModelForm не требует, чтобы переопределить поля. Я бы переписал ваши forms.py, чтобы отразить этот факт.

class AddRedditForm(forms.ModelForm): 
    class Meta: 
     model = Account 
     fields = ['user_name','password','secret','tag'] 
Смежные вопросы