Django更新现有模型字段

时间:2016-05-09 08:39:50

标签: django django-models django-forms insert-update updatemodel

我在Django中有一个带有Django用户模型外键的模型。我试图用表单更新我的模型,但数据库没有更新。我无法弄清楚问题所在。

model.py

from django.conf import settings

    class UserInfo(models.Model):
        username = models.CharField(max_length = 30)
        owner =  models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,)

form.py

from django import forms
from society.models import UserInfo

    class Editform(forms.ModelForm):
        username=forms.CharField(widget=forms.TextInput(attrs={'onchange': 'this.form.submit();', 'class': 'editinput'}))
        class Meta:
            model = UserInfo
            fields ='__all__'

views.py

 from django.shortcuts import render
    from society.models import UserInfo
    from django.contrib.auth.models import User
    from society.forms import Editform

        def ProfileView(request):
            user = request.user
            username = UserInfo.objects.get(owner=user)
            if request.method == 'POST':
                form = Editform(request.POST, instance=username)
                if form.is_valid():
                    form.save()
            else:
                form = Editform(instance=username)


            return render (request, 'profile_view.html', {'user':username, 'form':form})

url.py

from django.conf.urls import url
from django.contrib import admin
import society.views

    urlpatterns = [
        url(r'^$', 'society.views.home'),
        url(r'^admin/', admin.site.urls),
        url(r'^login/', 'django.contrib.auth.views.login'),
        url(r'^logout/', 'django.contrib.auth.views.logout'),
        url(r'^userreg/', 'society.views.UserReg'),
        url(r'^profile/', 'society.views.ProfileView'),
    ]

profile_view.html

    <div>
        <form method="POST">
        {% csrf_token %}
            {{form.username}}
            {{user.username}}
        </form>
    </div>

当我更改form.username时,user.username会立即更改,但数据库不会更新。我尝试添加提交按钮,但仍然没有运气。

4 个答案:

答案 0 :(得分:1)

您可以更新2方法,例如:在这里,我将更新您的用户名,

1)如果您使用object.get()

get_name = UserInfo.objects.get(owner=user)
get_name['username'] = 'Your Input what you need to change'
get_name.save()

2)如果你使用object.filter()

get_name = UserInfo.objects.filter(owner=user).update(username='your data') # or form.username

多数民众赞成......

答案 1 :(得分:1)

您应该传递记录ID以更新现有的UserInfo记录。

from django.shortcuts import render
from society.models import UserInfo
from django.contrib.auth.models import User
from society.forms import Editform

def ProfileView(request):
    user_id = request.POST.get('user_id')
    user = UserInfo.objects.get(pk=user_id)
    if request.method == 'POST':
        form = Editform(request.POST, instance=user)
        if form.is_valid():
            form.save()
    else:
        form = Editform(instance=user)

    return render (request, 'profile_view.html', {'user':username, 'form':form})

答案 2 :(得分:0)

除了其他任何东西,你还没有把你的表单指向任何东西,因此表单无法连接到视图的逻辑 - 实际上,你已经指定了表单应该是POST内容,而不是指向何处。

表单应指向urls.py文件中的URL,该URL当然与您在上面显示的视图相关联。这可以通过以下方式工作:

<form action="{% url 'core.views.new_comment' %}" method="post">
    {% csrf_token %} 
...
</form> 

还有更多指导about how this works here in the docs.(显然人们知道文档中的答案,诀窍是找到它。:))

(此外,您在views.py中的格式设置已关闭,但我认为在输入问题时这只是一个剪切和粘贴问题。)

答案 3 :(得分:0)

无论如何我解决了这个问题,谢谢大家。刚刚更改了form.py

来自django导入表单 来自society.models导入UserInfo

class Editform(forms.ModelForm):
    username=forms.CharField(widget=forms.TextInput(attrs={'onchange': 'this.form.submit();', 'class': 'editinput'}))
    class Meta:
        model = UserInfo
        exclude =('owner',)

由于所有者是必填字段,但我从模板中省略了它,显示必填字段错误。它现在正在工作。不管怎样,谢谢。