【问题标题】:Don't put the current value in the form不要将当前值放在表单中
【发布时间】:2020-09-28 09:56:08
【问题描述】:

遇到了这样一个问题,关于用户的当前值没有传递给表单。我要做的是将用户模型和配置文件模型结合起来,然后以两种形式显示当前用户数据进行编辑。它似乎正确完成,但由于某种原因它不起作用。请告诉我谁明白这一点)

文件views.py:

class ProfilePage(UpdateView):
        model=Profile
        template_name="market/profile.html"
        form_class=ProfileUpdateForm
        second_model = User
        second_form_class= UserUpdateForm
    
    
        def get_context_data(self, **kwargs):
            context = super(ProfilePage,self).get_context_data(**kwargs)
            context['UserUpdateForm'] = UserUpdateForm(
                prefix='UserUpdateForm', 
                data = self.request.POST,
                instance=self.request.user,
            )
            context['ProfileUpdateForm'] = ProfileUpdateForm(
                prefix='ProfileUpdateForm', 
                data = self.request.POST,
                files = self.request.FILES,
                instance=self.request.user.profile,
            )
            return context
    
        def post(self, request, *args, **kwargs):
            super(ProfilePage,self).post(self, request, *args, **kwargs)
            context = self.get_context_data(**kwargs)
            if context['UserUpdateForm'].is_valid():
                context['UserUpdateForm'].save()
            elif context['ProfileUpdateForm'].is_valid():
                context['ProfileUpdateForm'].save()
            return self.render_to_response(context)

文件forms.py:

class UserUpdateForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ("username",)


class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model=Profile
        fields=('valuta','slug','avtor')

文件models.py:

class Profile(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE)
    avtor=models.ImageField(default='user_images/default.jpg', upload_to='user_images',blank=True)
    slug=models.SlugField(max_length=50, unique=True,blank=True)
    valuta=models.ForeignKey(Valuta,default="5", on_delete=models.CASCADE)

文件profile.html:

<form method="POST">
    {% csrf_token %}
    {{UserUpdateForm.as_p}}
    <button type="submit">send</button>
</form>
<form action="" enctype="multipart/form-data" method="POST">
    {% csrf_token %}
    {{ProfileUpdateForm.as_p}}
    <button type="submit">send</button>
</form>

【问题讨论】:

  • 当您说current values ​​about the user are not passed to the form 时,您的意思是当表单初始化时,表单字段没有预填充用户对象值?或者你的意思是在发布时?
  • 当页面加载并发出这个ibb.co/BfYwbzk,我希望表单包含有关用户的当前数据,有他的用户名
  • 模板只是在做{{ form }}吗?如果需要,您可以在表单的 init 函数中将 initial 声明为 kwarg。如果您不知道我的意思,请告诉我,我会写一个答案
  • 是的,我想这就是我需要的。我需要用户立即查看他们的数据。我通过添加模板更新了问题

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


【解决方案1】:

当您在get_context_data 中创建表单时,您还传递了self.request.POST。所以它会尝试使用 POST 数据呈现表单(而一开始它是空的)。

您应该为 UserUpdateForm 和 ProfileUpdateForm 的这一行添加 or None

data = self.request.POST or None,
            

还有使用 files 的 ProfileUpdateForm :

files = self.request.FILES or None,

然后它将使用实例数据呈现表单,并在存在时使用 POST 数据。

【讨论】:

  • 当我点击提交时,表单已保存,一切正常,但现在又出现了另一个问题——页面加载完毕,另一个表单为空并出现错误:(
  • 我相信这是因为您在 HTML 中以两种形式分隔。当您提交时,只有一个表单通过您的请求,因此另一个表单在加载时没有所需的数据。
  • 很遗憾,因为当我将表单放在一起时,还有一个错误,当我保存表单时,我在登录字段中收到错误 - “此用户已存在。”好的,还是谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多