我目前正在使用Django创建一个社交平台。现在,我正在开发“配置文件设置”页面,希望最终用户能够更改其标题和显示图像。
但是,我无法使表单正常工作。 Header和Display-images都正确地通过POST表单传递,最终存储在媒体根目录中,我从那里调用模板中的所有Header和Display-images。
所以现在的问题是将提交的图像称为当前用户的标题或显示图像。这是我的Profiel(配置文件的荷兰语)Models.py:
class Profiel(models.Model):
user = models.OneToOneField(User, primary_key=True)
Profielfoto = models.ImageField(blank=True, upload_to="profile_image", default="profile_image/no_profile_pic.jpg")
Profielheader = models.ImageField(blank=True, upload_to="profile_header")
Biografie = models.CharField(blank=True, max_length=150, default="Biografie nog niet ingevuld.")
def __str__(self):
return self.user.username
def create_profile(sender, **kwargs):
if kwargs['created']:
user_profile = Profiel.objects.create(user=kwargs['instance'])
post_save.connect(create_profile, sender=User)
我的Views.py
@login_required
def profile_edit_view(request):
if request.method == 'POST':
form = Edit_profile_forms(request.POST, request.FILES)
if form.is_valid():
form.save()
# Redirect to the document list after POST
return HttpResponseRedirect(reverse('profiel_edit'))
else:
form = Edit_profile_forms(request.POST, request.FILES)
args = {'form':form}
return render(request, 'Dashboard/profiel_edit.html', args)
我的forms.py:
class Edit_profile_forms(forms.ModelForm):
class Meta:
model = Profiel
fields = (
'Profielfoto',
'Profielheader',
'Biografie',
)
我认为这些是唯一需要向您展示解决此问题的方法,因为表单正在正确地执行其他操作。所以我最后的问题是:
如何将当前用户的页眉/图像文件更新为表单中提交的文件?
答案 0 :(得分:0)
我编辑了我的答案,因此您可以复制并粘贴到您的视图中。
@login_required
@csrf_protect
def profile_edit_view(request):
template = 'Dashboard/profiel_edit.html'
qv = Profiel.objects.get(user=request.user.id)
if request.method == 'POST':
form = Edit_profile_forms(request.POST, request.FILES, instance=qv)
if form.is_valid():
form.save()
return HttpResponseRedirect(some_view)
else:
print form.errors
else:
form = Edit_profile_forms(instance=qv)
return render(request, template, {'form':form})
答案 1 :(得分:0)
我了解您希望让用户通过表单上传新图片来编辑他们的个人资料/标题图片。您的代码只是通过表单从数据中保存新数据,而不是更新现有数据。
Django有基于类的视图。 please check this link
来自django.views.generic.edit导入UpdateView
class UpdateExampleView(UpdateView):
model = your model
form_class = your Form
template_name = 'your template'
success_url = path to go when form successfully passed
# additionally you can handle your data with these methods
def get_form_kwargs(self):
def get_context_data(self, **kwargs):
def form_valid(self, form):
不要忘记你需要像这样通过url给出pk号码
url(r'^example/path/(?P<pk>[0-9]+)/$', your class view or function view, name='your name'),
我想知道我是否理解你的问题。根据我的理解,你没有问题用表格保存图像数据。所以我知道你在为用户加载这些图片时遇到问题。
您必须在settings.py中设置保存媒体文件的位置,如下所示。
settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
并且您说您的图片正确保存在媒体根目录中。
所以如果你检查数据库中的Profiel表, 在Profielfoto领域,ProfielHeader,将有路径。
例如,如果您的个人资料照片的名称是'profiletest.jpg',
Profielfoto字段中的数据将为“profile_image/profiletest.jpg
”。
因为你在Model类中设置了upload_to="profile_image"
。
如果要从视图(模板)中的媒体文件夹加载图像, 你写的如下。
<img src="{{MEDIA_URL}}{{yourimagepath}}"/>
要使用{{MEDIA_URL}},您应该将django.template.context_processors.media
放入settings.py
settings.py
...
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.template.context_processors.media',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
...