Django formset设置当前用户 [英] Django formset set current user

查看:61
本文介绍了Django formset设置当前用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题相关,但是扩展它 - 我将如何在表单集中使用这种技术?



我想以一种形式使用当前登录的用户,但是我使用表单中的表单。单个表单的引用解决方案是将request.user传递给init中的表单和进程。如何在表单集中添加每个表单的kwargs?



我的代码中的示例:



form.py

  class NewStudentForm(forms.Form):
username = forms.RegexField(label = _(用户名),max_length = 30,regex = r'^ \w + $',
help_text = _(必需30个字符以内,仅字母数字字符(字母,数字和下划线)),
error_message = _(此值必须只包含字母,数字和下划线。))
first_name = forms.CharField(label = _('first name'),max_length = 30)
last_name = forms.CharField(label = _('last name'),max_length = 30,)
email = forms.EmailField(label = _('e-mail address'))
password = .CharField(label = _('password'),max_length = 64,)

class Meta:
model = User
fields =(username,first_name last_name,email,password)

def __init __(self,* args,** kwarg s)
self._user = kwargs.pop('user')
super(NewStudentForm,self).__ init __(* args,** kwargs)


def save(self,commit = True):
user = super(NewStudentForm,self).save(commit = False)
user.set_password(self.cleaned_data [password])
如果提交:
user.save()
profile = Profile.objects.create_profile(user)
profile.activiation_key = profile.ACTIVATED_KEY
profile.authorized = True
profile.save()
user.is_active = True
user.save()
student = models.Student()
student.user = user
学生。 teacher = self._user
student.plaintext_pwd = self.cleaned_data [password]
student.save()
return UserWarning

然后在views.py

  @login_required 
def new_student(r equest):
from django.forms.formsets import formset_factory
try:
if request.method =='GET':
newStudentFormset = formset_factory(forms.NewStudentForm,extra = 2 )
formset = newStudentFormset()
return shortcuts.render_to_response('NewStudent.html',{'newStudentFormSet':formset,'active_username':request.user.username})
elif请求。方法=='POST':
如果LOGIN_FORM_KEY在request.POST:
返回_handle_login(请求)
data = request.POST.copy()
newStudentFormset = formset_factory(forms。 NewStudentForm)
formset = newStudentFormset(data)###将当前用户传递给formset? ###
如果formset.is_valid():
formset.save()
request.user.message_set.create(message =保存成功)
返回快捷方式。重定向(学生)
else:
返回shortcuts.render_to_response('NewStudent.html',{'newStudentFormSet':formset,'active_username':request.user.username,'e​​rror_message':formset.errors} )
返回http.HttpResponseNotAllowed(['GET','POST'])
except models.Student.DoesNotExist:
返回http.HttpResponseNotFound('< h1>请求的学生未找到< / h1>')


解决方案

BaseFormSet 您可以添加自定义代码以将参数传递到表单。



表单中。$ <$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $
$ b $ args,** kwargs):
self.user = kwargs.pop('user',None)
super(NewStudentFormSet,self).__ init __(* args,** kwargs)

def _construct_forms(self):
self.forms = []
在xrange(self.total_form_count())中的
self.forms.append(self._construct_form(i,user = self.user))

然后在 views.py 中:

 #... 

data = request.POST.copy()
newStudentFormset = formset_factory(forms。 NewStudentForm,formset = forms.NewStudentFormSet)
formset = newStudentFormset(data,user = request.user)

#...

感谢 Ashok Raavi


Related to this question, but expanding on it - How would I use this technique in a formset?

I'd like to use the current logged in user in a form, but I'm using the form in a formset. The referenced solution for a single form is to pass request.user to the form and process in init. How do I add to the kwargs for each form in the formset?

Example in my code:

in forms.py

class NewStudentForm (forms.Form):
    username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^\w+$',
        help_text = _("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."),
        error_message = _("This value must contain only letters, numbers and underscores."))
    first_name = forms.CharField(label=_('first name'), max_length=30 )
    last_name = forms.CharField(label=_('last name'), max_length=30, )
    email = forms.EmailField(label=_('e-mail address') )
    password = forms.CharField(label=_('password'), max_length=64, )

    class Meta:
        model = User
        fields = ("username","first_name", "last_name", "email", "password")

    def __init__(self, *args, **kwargs):
        self._user = kwargs.pop('user')
        super(NewStudentForm, self).__init__(*args, **kwargs)


    def save(self, commit=True):
        user = super(NewStudentForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
            profile = Profile.objects.create_profile(user)
            profile.activiation_key = profile.ACTIVATED_KEY
            profile.authorized = True
            profile.save()
            user.is_active=True
            user.save()
            student = models.Student()
            student.user = user
            student.teacher = self._user
            student.plaintext_pwd = self.cleaned_data["password"]
            student.save()
        return UserWarning

then in views.py

@login_required
def new_student(request):
    from django.forms.formsets import formset_factory
    try:
        if request.method == 'GET':
            newStudentFormset = formset_factory(forms.NewStudentForm, extra=2)
            formset = newStudentFormset()
            return shortcuts.render_to_response('NewStudent.html', { 'newStudentFormSet':formset, 'active_username': request.user.username })
        elif request.method == 'POST':
            if LOGIN_FORM_KEY in request.POST:
                return _handle_login(request)
            data = request.POST.copy()
            newStudentFormset = formset_factory(forms.NewStudentForm)
            formset = newStudentFormset(data) ### Pass current user to formset? ###
            if formset.is_valid():
                formset.save()
                request.user.message_set.create(message="Save successful.")
                return shortcuts.redirect(student)
            else:
                return shortcuts.render_to_response('NewStudent.html', { 'newStudentFormSet':formset, 'active_username': request.user.username, 'error_message':formset.errors})
        return http.HttpResponseNotAllowed(['GET', 'POST'])
    except models.Student.DoesNotExist:
        return http.HttpResponseNotFound('<h1>Requested Student not found</h1>')

解决方案

By adding a class that extends BaseFormSet you can add custom code to pass a parameter to the form.

in forms.py:

class NewStudentFormSet(BaseFormSet):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(NewStudentFormSet, self).__init__(*args, **kwargs)

    def _construct_forms(self): 
        self.forms = []
        for i in xrange(self.total_form_count()):
            self.forms.append(self._construct_form(i, user=self.user))

Then in views.py:

# ...

data = request.POST.copy()
newStudentFormset = formset_factory(forms.NewStudentForm, formset=forms.NewStudentFormSet)
formset = newStudentFormset(data, user=request.user)

# ...

Thanks to Ashok Raavi.

这篇关于Django formset设置当前用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆