【问题标题】:Django - Modelform not renderingDjango - Modelform 不呈现
【发布时间】:2018-05-31 12:30:44
【问题描述】:

我创建了一个表单来更新用户的个人资料,但是当我运行它时,没有错误,但是当我尝试打开页面时,出现了标题但没有出现 UpdateBioForm。其次,我想知道如何创建一个大文本框来存储某人的传记。

模型.py

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    biography = models.CharField(max_length = 255, default = '')
    city = models.CharField(max_length=100, default = '')
    website = models.URLField(default='')
    image = models.ImageField(upload_to='profile_image', blank=True)

    def setdefault(self, default_path='/profile_image/Default.jpg'):
        if self.image:
            return self.image
        return default_path

    def __str__(self):
        return self.user.username

Forms.Py

class UpdateBioForm(forms.ModelForm):

    class Meta:
        model = UserProfile
        fields = (
            'biography',
            'city',
            'website'
        )

    def save(self, commit=True):
        savedBio = super(UpdateBioForm, self).save(commit=False)
        savedBio.biography = self.cleaned_data['biography']
        savedBio.city = self.cleaned_data['city']
        savedBio.website = self.cleaned_data['website']

        if commit:
            savedBio.save()

        return savedBio

Views.py

def update_bio(request):
    if request.method == 'POST':
        form = UpdateBioForm(request.POST, instance=request.user)

        if form.is_valid():
            form.save()
            return redirect('/')
    else:
        form = UpdateBioForm(instance=request.user)
    args = {'form':form}
    return render(request, 'accounts/update_bio.html')

urls.py

url(r'^profile/updatebio/$',views.update_bio, name='update_bio'),

update_bio.html

{% extends 'base.html' %}

{% block body %}
<div class="container">
    <h1>Update Biography</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>
</div>
{% endblock %}

【问题讨论】:

  • 不相关,但是为什么要覆盖表单的save() 方法?

标签: django forms views modelform


【解决方案1】:

您没有将任何上下文传递给您的 render() 方法 - 您定义了 args 但不对该变量执行任何操作。将其更改为:

args = {'form':form}
return render(request, 'accounts/update_bio.html', context=args) # <-- You're missing context

【讨论】:

  • 是的,这行得通。我不敢相信我漏掉了一个字。但是传记行出现在一行中以供输入。如何获得更大的文本框?
  • 查看此问题以获取文本框问题的答案:stackoverflow.com/questions/8761106/…
猜你喜欢
  • 2019-11-22
  • 2017-08-04
  • 1970-01-01
  • 2016-04-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
相关资源
最近更新 更多