【问题标题】:Why I can't update my one-to-one model's FileField in Django?为什么我不能在 Django 中更新我的一对一模型的 FileField?
【发布时间】:2019-05-29 23:36:38
【问题描述】:

为了给默认模型添加更多功能,我在 Django 中采用了一对一归档。然后我想自定义我的更新/编辑用户资料页面。 我这样重写更新表单

{% load static %}
...

<div  id="block-center" class="col-md-6 col-md-offset-3">

<form method="post">
  {% csrf_token %}
          ...
          <div class="form-group">
            <p>
                <label for="id_location">Location:</label> <input class="form-control" placeholder="Location"type="text" name="location" value="{{user.profile.location}}"maxlength="30" id="id_location" />
            </p>
          </div>
          <div class="form-group">
                {% if user.profile.upload.url%}
                <p class="file-upload">Currently: <img src="{{user.profile.upload.url}}" alt="Avatar" class="avatar"><br></p>
                <label for="id_upload">Change:</label> <input type="file" name="upload"  value="{{user.profile.upload}}" id="id_upload" />

                {% else%}
                <label for="id_upload">Avator:</label> <input type="file" name="upload"  value="{{user.profile.upload}}" id="id_upload" />
                {% endif %}
          </div>
          <button class="btn btn-primary" type="submit">Save changes</button>
</form>
</div>

我的models.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, blank=True)
    location = models.CharField(max_length=30, blank=True)
    birth_date = models.DateField(null=True, blank=True)
    upload = models.FileField()
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

我的views.py:

from django.db import models
from django.contrib.auth.models import User
from users.forms import UserForm,ProfileForm
from django.contrib import messages
from django.shortcuts import render,redirect
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth import login,logout,authenticate
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.decorators import login_required
from django.db import transaction
from django.utils.translation import gettext as _

@login_required
@transaction.atomic
def update_profile(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST, instance=request.user)
        profile_form = ProfileForm(request.POST, instance=request.user.profile)
        profile = request.user.profile
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request, _('Your profile was successfully updated!'))
            return redirect('blog:index')
        else:
            messages.error(request, _('Please correct the error below.'))

    else:
        user_form = UserForm(instance=request.user)
        profile_form = ProfileForm(instance=request.user.profile)
        user = User.objects.get(id=request.user.id)
        profile = request.user.profile
    return render(request, 'profiles/profile.html', {
        'user_form': user_form,
        'profile_form': profile_form,
        'profile':profile
    })

除了 Userprofile 模型中的文件字段上传之外,所有其他字段都可以正常工作。我不知道为什么。谁能帮帮我?

【问题讨论】:

    标签: django one-to-one filefield


    【解决方案1】:

    尝试将 enctype 添加到您的表单标签中:

    <form method="post" enctype="multipart/form-data">
    

    上传文件时需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 2017-08-12
      相关资源
      最近更新 更多