如何在Django中更新用户的模型字段?

时间:2017-02-22 12:02:54

标签: python django forms models

我目前正在使用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',
    )

我认为这些是唯一需要向您展示解决此问题的方法,因为表单正在正确地执行其他操作。所以我最后的问题是:

如何将当前用户的页眉/图像文件更新为表单中提交的文件?

2 个答案:

答案 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',
            ],
        },
    },
]
...