【问题标题】:How To Update Existing Profile Django Model Form如何更新现有的配置文件 Django 模型表单
【发布时间】:2013-10-20 21:23:32
【问题描述】:

我试图让用户在注册后能够创建和编辑他们的个人资料。我正在使用模型表格。我需要做的是用当前用户填写雇主模型字段。

这是我的看法:

def update_profile(request, username):
    if request.method == 'POST':
        edit_profile_form=EditProfileForm(request.POST)
        if edit_profile_form.is_valid():
            editprofile = edit_profile_form.save(commit=False)
            editprofile.employer = request.user.get_profile()
            editprofile.save()
    edit_profile_form = EditProfileForm()
    context = {'edit_profile_form':edit_profile_form,}
    return render(request, 'pandaboard/editprofile.html', context)

这是我的模型:

class Profile(models.Model):
    employer = models.ForeignKey(User)
    company_name = models.CharField(max_length=100)
    company_description = models.TextField()
    company_website = models.URLField(max_length=200, blank=True)
    contact_email = models.EmailField(max_length=100)
    contact_name = models.CharField(max_length=100)
    def __unicode__(self):
        return self.company_name

这是我的模型表格

from django.forms import ModelForm
from pandaboard.models import JobPost, Profile
from django.contrib.auth.models import User

class EditProfileForm(ModelForm):
    class Meta:
        model = Profile
        fields = ['company_name','company_description','company_website','contact_email','contact_name']

【问题讨论】:

  • EditProfileForm 是 Profile 的 ModelForm 吗?请发布您的表单类。
  • 好的,我添加了我的模型表单
  • 更新模型时,通常您会将模型表单交给模型实例,以使用模型中的现有数据预填充表单。那是你需要做的吗?还是您不想这样做,而是需要将当前用户注入表单?
  • 我实际上需要同时做这两件事。但是这个表格是用来更新已经存在的模型的。
  • 明白了。我将发布一个如何做到这一点的示例。

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


【解决方案1】:

要使用现有模型实例中的值水合您的表单,您需要在模型表单上使用 instance 参数:

def update_profile(request, username):
    profile = request.user.get_profile()
    edit_profile_form = EditProfileForm(request.POST or None,
        current_user=request.user, instance=profile)

    if request.method == 'POST':
        if edit_profile_form.is_valid():
            editprofile.save()

    context = {'edit_profile_form': edit_profile_form}
    return render(request, 'pandaboard/editprofile.html', context)

要注入当前的 request.user,您可以覆盖 __init__EditProfileForm,传入一个额外的关键字参数(或 arg,这并不重要),然后将其从 kwargs 中弹出调用 super 这样你就不会向 ModelForm 传递它不期望的关键字参数:

class EditProfileForm(ModelForm):
    class Meta:
        model = Profile

    def __init__(self, *args, **kwargs):
        current_user = kwargs.pop('current_user')
        super(EditProfileForm, self).__init__(*args, **kwargs)
        self.fields['employer'] = current_user

现在您不必传递commit=False 并在视图中手动设置employer 的值。

【讨论】:

  • 我收到以下错误:无法将关键字“用户”解析为字段。选项包括:company_description、company_name、company_website、contact_email、contact_name、employer、id、jobpost 我是否需要将雇主字段实际称为 user?
  • 嗯。我没有看到您的代码无法运行的原因,但我确实注意到您已将 .pyc 文件签入 Git。您需要在 .gitignore 中排除这些内容。尝试清除所有 .pyc 文件并重新启动内置服务器。
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 2010-10-12
  • 2017-05-05
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2020-12-01
  • 2021-09-19
相关资源
最近更新 更多