【问题标题】:How to update a variable within a View.py如何更新 View.py 中的变量
【发布时间】:2015-07-13 16:54:25
【问题描述】:

考虑一下这个简单的用户配置文件:

from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    onboarding_step = models.SmallIntegerField(default='1')

每次提交来自不同模型的单独表单时,它在 UserProfile 中增加 onboarding_step 的最简单方法是什么?例如:

这是我提交的 ModelForm(来自单独的模型、站点):

class OnBoardingProgressForm(forms.ModelForm):
      class Meta:
            model = Site
            fields = ( 'abc', 'xyz', )

这是表单的 view.py:

if request.method == "POST":
    form = OnBoardingProgressForm( request.POST )
        if form.is_valid():
            ....
            THIS CODE DOES NOT WORK BUT IS MY BEST GUESS:
            last = request.user.profile
            last.onboarding_step = 2
            ....
            obj = form.save(commit=False)
            obj.user = current_user
            obj.save()

            return render(request, "nextpage.html", {'form': form })

如何将user.onboarding_step 增加1

【问题讨论】:

  • 我不确定您在哪里遇到问题。你知道如何从请求中获取用户,你知道如何添加一个数字,你知道如何保存对象。你有什么问题?
  • @DanielRoseman 谢谢,不过我不知道正确的代码语法(或从哪里开始!)
  • 但我仍然很难理解这一点。你知道如何做所有这些事情,你已经在上一个问题和这个问题中证明了这一点。你已经有current_user;您知道如何从用户转到 userprofile 模型,并且您知道如何将一个数字添加到另一个数字。那么哪些位你不知道该怎么做呢?
  • 当我为 OnBoardingProgress 模型提交表单时,如何获取要保存在 userprofile 模型中的变量?

标签: django django-models django-forms django-views


【解决方案1】:
if request.method == "POST":
    form = OnBoardingProgress( request.POST )
        if form.is_valid():
            ....
            // Can I increment the code here? //
            ....
            obj = form.save(commit=False)                
            obj.user = current_user
            obj.save()

            user_obj = UserProfile.objects.get(user=request.user)
            user_obj.onboarding_step = user_obj.onboarding_step + 1
            user_obj.save()

            return render(request, "nextpage.html", {'form': form })

或者您也可以创建自动增量字段。

【讨论】:

  • 这似乎不起作用(没有错误消息);可能是因为您依赖 onboarding_step 处于 OnBoardingProgress 中,这不是吗?
  • 你到底想要什么?每次保存表单时,我编辑的代码都会增加 onboarding_step。你想按用户递增 1 吗?
  • 我尝试更新的模型与带有表单的模型不同。该表单没有与模型相关的字段。
  • 谢谢,我正在为模型site 提交表单,我想在单独的模型userprofile 中增加一个字段@
  • 太棒了,谢谢。出于兴趣,为什么当我尝试'onboarding_step = request.user.profile.onboarding_step + 1'时它不起作用?
【解决方案2】:

获取当前用户的UserProfile对象,然后增加onboarding_step的属性值。

试试这个:

if request.method == "POST":
    form = OnBoardingProgress(request.POST)
    current_user = request.user
    if form.is_valid():  
        user_profile = UserProfile.objects.filter(user=current_user)[0] # get the user profile object for the current user
        user_profile.onboarding_step += 1 # increment the value  
        user_profile.save() # save the object                 
        obj = form.save(commit=False)
        obj.user = current_user
        obj.save()

        return render(request, "nextpage.html", {'form': form })

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 2020-07-11
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多