Python 基于当前用户Django 1.6更新现有表单

Python 基于当前用户Django 1.6更新现有表单,python,django,django-models,django-forms,django-views,Python,Django,Django Models,Django Forms,Django Views,我有一个表单,我想根据当前用户更新其值,但在单击“提交”时无法更新表单。当前值未更新 这是我的观点 @login_required(login_url='/') def student_update(request): #return UpdateView(request, form_class=UpdateStudentForm, object_id=request.user, template_name='success.htm') form = UpdateStude

我有一个表单,我想根据当前用户更新其值,但在单击“提交”时无法更新表单。当前值未更新

这是我的观点

@login_required(login_url='/')
def student_update(request):
    #return UpdateView(request, form_class=UpdateStudentForm, object_id=request.user,    template_name='success.htm')
    form = UpdateStudentForm(request.POST, instance=request.user)
    if request.method == 'POST':
        if form.is_valid():
            m = form.save(commit=False)
            m.user = request.user
            m.save()
            return HttpResponseRedirect('/success.html')
    else:
        form = UpdateStudentForm(instance=request.user)
    return render(request, "famu/profile.html", {'form': form})
我的表格.py

class UpdateStudentForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = ('street_number', 'street_name', 'apt_number', 'city','state','zipcode')
    #def save(self, commit=True):
    #    user = super(UpdateStudentForm, self).save(commit=False)
    #    user.state = self.cleaned_data['state']
    #    if commit:
    #    user.save()
    #    return user
my model.py包含以下代码

from django.db import models
from django.contrib.auth.models import User


class Student(models.Model):
    CLASSIFICATION = (
        ('FR', 'Freshman'),
        ('SO', 'Sophomore'),
        ('JR', 'Junior'),
        ('SR', 'Senior'),
        ('GR', 'Graduate'),
    )
    TERMS = (
        ('F', 'Fall'),
        ('S', 'Spring'),
        ('Su', 'Summer'),
    )
    MAJOR = (
        ('CS', 'Computer Science'),
        ('CY', 'Computer Systems'),
        ('IT', 'Information Technology'),
    )
    username = models.OneToOneField(User)
    student_id = models.IntegerField(primary_key=True, max_length=9)
    classification = models.CharField(max_length=2, choices=CLASSIFICATION)
    enrolled_year  = models.IntegerField(max_length=4)
    enrolled_term = models.CharField(max_length=2, choices=TERMS)
    major = models.CharField(max_length=2, choices=MAJOR)
    street_number = models.IntegerField(max_length=10)
    street_name = models.CharField(max_length=45)
    apt_number = models.CharField('apt #', max_length=10, blank=True, )
    city = models.CharField(max_length=30)
    state = models.CharField(max_length=2)
    zipcode = models.IntegerField('Zip Code', max_length=5, )


    last_modified = models.DateTimeField(auto_now=True)



class Grade (models.Model):
    GRADES = (
        ('A', 'A'),
        ('B', 'B'),
        ('C', 'C'),
        ('D', 'D'),
        ('F', 'F'),
        ('T', 'Transfer'),
    )
    TERMS = (
        ('F', 'Fall'),
        ('S', 'Spring'),
        ('Su', 'Summer'),
    )
    CREDITS = (
        (1, '1'),
        (2, '2'),
        (3, '3'),
        (4, '4'),
        (5, '5'),
        (6, '6'),
        (7, '7'),
        (8, '8'),
        (9, '9'),

    )
    student_id = models.ForeignKey(Student)
    course_prefix = models.CharField(max_length=3)
    course_number = models.CharField(max_length=5)
    grade= models.CharField(max_length=1, choices=GRADES)
    term_taken = models.CharField(max_length=2, choices=TERMS)
    year_taken = models.IntegerField(max_length=4)
    credits = models.IntegerField(max_length=1, choices=CREDITS)
class Message (models.Model):
    sender = models.ForeignKey(User, related_name='sender')
    receiver = models.ForeignKey(User, related_name='receiver')
    message_content = models.CharField(max_length=1000)

class Gradapp (models.Model):
    student_id = models.OneToOneField(Student, primary_key=True)
    submitted = models.BooleanField(default=False)
    last_modified = models.DateTimeField(auto_now=True)

根据models.py,views.py中的这一行:

m.user = request.user
应该是

m.username = request.user

request.POST包含表单数据,但是在顶部实例化表单的地方,如果它是GET,那么它也可能是一个空的QueryDict。这很可能是导致问题的原因,如果是GET,则应该不传递任何消息。试试这个:

form = UpdateStudentForm(request.POST or None, instance=request.user)
请注意,这也会清理您的代码,因为您不需要为GET创建另一个表单:

form = UpdateStudentForm(request.POST or None, instance=request.user)
if request.method == 'POST':
    if form.is_valid():
        m = form.save(commit=False)
        m.user = request.user
        m.save()
        return HttpResponseRedirect('/success.html')
return render(request, "famu/profile.html", {'form': form})

为什么要将MF字段重写为字符串列表?您正在丢失该列表中包含的所有对象信息。我不确定您指的是哪一行?字段=('street\u number','street\u name','apt\u number','city','state','zipcode')。这些字段在哪里声明或绑定到学生模型?哦,对不起,我应该显示完整模型方法,我已经更新了问题以包括完整模型实现。当我这样做时,用户名成为request.user对象的id