在is_valid()之前设置表单域值 [英] Set form field value before is_valid()

查看:101
本文介绍了在is_valid()之前设置表单域值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些麻烦,掌握如何做到这一点。我非常努力地搜索Google,没有任何运气。



我将从一些代码开始,并解释我正在努力做什么:



models.py



  class Action(models.Model) :
title = models.CharField(max_length = 200)
owner = models.ForeignKey(User,related_name ='actions')
created_by = models.ForeignKey(User,related_name ='+' ,editable = False)
modified_by = models.ForeignKey(User,related_name ='+',editable = False)

class ActionForm(ModelForm):
class Meta:
model = Action



views.py



默认情况下,所有者有一个下拉字段。我有一个图标,允许用户在文本字段中输入新的用户名,而不是为所有者输入。我查看是否提交了 owner_new ,如果是,请创建该用户。然后,我需要将所有者字段设置为该值,以便 form.is_valid()将成为true。 p>

  def action_create(request):
如果request.method =='POST':
form = ActionForm request.POST)
#检查是否应该创建新用户
如果请求中的owner_new.POST:
#检查用户是否已经存在
user = User.objects.get (username = request.POST.get('owner_new'))
如果不是用户:
user = User.objects.create_user(request.POST.get('owner_new'))
#这里是我在哪里学习
form.owner = user.id
如果form.is_valid():#这个失败BECAUSE form.owner不设置
action = form.save( commit = False)
action.created_by = request.user
action.modified_by = request.user
action.save()
返回重定向('action_registe r:index')
else:
form = ActionForm()
return render(request,'actions / create.html',{'form':form})


解决方案

你可以试试这个:


$ b $




$ b如果request.method =='POST':
form = ActionForm(request.POST)
#检查是否应该创建新用户
如果request中有owner_new.POST:
#检查用户是否已经存在
user,_ = User.objects.get_or_create(username = request.POST。 get('owner_new')

updated_data = request.POST.copy()
updated_data.update({'owner':user})
form = MyForm(data = updated_data)

如果form.is_valid():#这个失败BECAUSE form.owner不设置
action = form.save(commit = False)
action.created_by = request.user
行为ion.modified_by = request.user
action.save()
返回重定向('action_register:index')
else:
form = ActionForm()
返回渲染(请求'action / create.html',{'form':form})

这样做的方式是:



添加 required = False 所有者字段。
现在,

  if form.is_valid():#这个失败因为form.owner没有设置
action = form.save(commit = False)
如果request中有owner_new.POST:
user,_ = User.objects.get_or_create(username = request.POST.get('owner_new' ))
action.owner = user
action.created_by = request.user
action.modified_by = request.user
action.save()
return redirect(' Action_register:index')


I'm having a bit of trouble grasping how to do this. I've put my best effort into searching Google without any luck.

I'll start with a bit of code and explain what I'm trying to do as I go:

models.py

class Action(models.Model):
    title = models.CharField(max_length=200)
    owner = models.ForeignKey(User, related_name='actions')
    created_by = models.ForeignKey(User, related_name='+', editable=False)
    modified_by = models.ForeignKey(User, related_name='+', editable=False)

class ActionForm(ModelForm):
    class Meta:
        model = Action

views.py

By default, there is a dropdown field for owner. I have an icon that allows the user to enter a new username in a text field instead for owner. I check to see if owner_new was submitted and if so, create that user. I then need to set the owner field to that value so that form.is_valid() will be true.

def action_create(request):
    if request.method == 'POST':
        form = ActionForm(request.POST)
        # check if new user should be created
        if 'owner_new' in request.POST:
            # check if user already exists
            user = User.objects.get(username=request.POST.get('owner_new'))
            if not user:
                user = User.objects.create_user(request.POST.get('owner_new'))
            # HERE IS WHERE I'M STUMPED
            form.owner = user.id
        if form.is_valid(): # THIS FAILS BECAUSE form.owner ISN'T SET
            action = form.save(commit=False)
            action.created_by = request.user
            action.modified_by = request.user
            action.save()
            return redirect('action_register:index')
    else:
        form = ActionForm()
    return render(request, 'actions/create.html', {'form': form})

解决方案

You can try this:

def action_create(request):
    if request.method == 'POST':
        form = ActionForm(request.POST)
        # check if new user should be created
        if 'owner_new' in request.POST:
            # check if user already exists
            user, _ = User.objects.get_or_create(username=request.POST.get('owner_new'))                

            updated_data = request.POST.copy()
            updated_data.update({'owner': user}) 
            form = MyForm(data=updated_data) 

        if form.is_valid(): # THIS FAILS BECAUSE form.owner ISN'T SET
            action = form.save(commit=False)
            action.created_by = request.user
            action.modified_by = request.user
            action.save()
            return redirect('action_register:index')
    else:
        form = ActionForm()
    return render(request, 'actions/create.html', {'form': form})

A cleaner way of doing this is:

add required=False to the owner field. Now,

if form.is_valid(): # THIS FAILS BECAUSE form.owner ISN'T SET
    action = form.save(commit=False)
    if 'owner_new' in request.POST:
        user, _ = User.objects.get_or_create(username=request.POST.get('owner_new'))                
        action.owner = user
    action.created_by = request.user
    action.modified_by = request.user
    action.save()
    return redirect('action_register:index')

这篇关于在is_valid()之前设置表单域值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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