【问题标题】:Excluding a field in a ModelForm排除 ModelForm 中的字段
【发布时间】:2014-06-20 01:12:17
【问题描述】:

根据要求,我包含了我所有的模型和表单字段。

型号:

from django.db import models
from django.contrib.auth.models import User
from taggit.managers import TaggableManager


class StudentProfile(models.Model):

  student = models.OneToOneField(User)
  name = models.CharField(max_length=30)
  website = models.URLField(max_length=50)


  def __unicode__(self):
   return self.user.username

class Skills(models.Model):

   student = models.ForeignKey(StudentProfile)
   title = models.CharField(max_length=50)

   tags = TaggableManager()

   def __unicode__(self):
    return self.student

class Experience(models.Model):

    student = models.ForeignKey(StudentProfile)

    company = models.CharField(max_length=25)
    profile = models.CharField(max_length=25)


    def __unicode__(self):
         return self.student

模型表单

from django import forms
from django.forms import ModelForm
from django.contrib.auth.models import User
from models import StudentProfile


class StudentProfileForm(forms.ModelForm):

   class Meta:
   model = StudentProfile
       exclude = ['student']

   def __init__(self, user, *args, **kwargs):
         self._user = user
         super(StudentProfileForm, self).__init__(*args, **kwargs)

class UserForm(forms.ModelForm):

    class Meta:
    model = User
    fields = ('username', 'password')

    def clean_username(self):
     username = self.cleaned_data['username']

     try:
       User.objects.get(username = username)
       raise forms.ValidationError("That username is already taken"+username)

     except User.DoesNotExist:

       return username

def clean_password(self):
    password = self.cleaned_data.get('password', '')
    if password == '':
         raise forms.ValidationError("Password be atleast 2 characters ")

    return password 

views.py:

from forms import StudentProfileForm
from django.contrib.auth.models import User


def editbio(request):

 if request.method == 'POST':

    student = User(username = request.user)
    basic_form = StudentProfileForm(data=request.POST, user=student)

    if basic_form.is_valid():

        info = basic_form.save(commit=False)
        info.student = request.user
        info.save()

我正在尝试从模型表单中排除“用户”,以便将当前用户添加到其中。但我不断收到表单错误:

<ul class="errorlist"><li>student<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

我正在通过以下方式获取发布数据(来自表单):

$(function editinfo(){

$(".inline-form").submit(function() {

    $.ajax({
    url : "/editbio",
    type : "POST",
    dataType: "json",

    data :

        $(this).serialize(),


    success : function(json) {
            $('.result').html( 'Server Response: ' + json.server_response);
        },

    error: function(data) {
            $(".result").html("Something went wrong!");
        }

    });

    return false;

});

});

我搜索了很多结果,但没有成功。虽然我在表单中使用了“排除”,但在print basic_form.fields 中仍然显示“学生”字段 request.POST的内容:http://pastebin.com/eLQfTFB1

让我知道我在这里做错了什么,任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 你能发布print basic_form.fields的结果吗?另外,这些是您完整的模型和表单类吗?如果是这种情况,我看不出它是如何工作的,否则请发布完整的代码。
  • 我已经编辑了我的答案,请看一下。 print basic_form.fields 显示 pastebin.com/25tPVu6F
  • 你使用的是哪个 Django 版本?我似乎无法复制这个问题,你能提供一个minimal, complete and verifiable example吗?
  • 哦,你能发布所有相关的导入语句吗?

标签: jquery django


【解决方案1】:

basic_form = StudentProfileForm(data=request.POST, user=student) 应该 basic_form = StudentProfileForm(request.POST)

编辑:对于后人来说,这个问题原来是一个空白问题。给 Python 开发者的建议,将您的编辑器设置为仅使用空格或仅使用制表符。

【讨论】:

  • 给出 500 错误。我的 Firebug 显示:__init__() 至少需要 2 个参数(1 个给定)
  • 对,那是因为你重写了表单的init方法。删除它并尝试 StudentProfileForm(request.POST)。
  • 这次出错:__init__() 得到了一个意外的关键字参数“学生”
  • 你确定你不是通过学生吗?只需通过 request.POST:StudentProfileForm(request.POST)..
  • 只有 StudentProfileForm(request.POST),我总是遇到表单错误。正如我的问题中提到的那样。
【解决方案2】:

使用exclude = ['student'] 而不是fields = ('name', 'website'), 它应该可以工作。

fields 用于让您决定要在模板中显示哪些字段(当您使用form.as_pform.as_ul 生成表单时,这是必需的)

但这里有一个棘手的问题:

StudentProfileForm 表单中覆盖student 并使其不需要,如下所示:

student = forms.CharField(required=False)

万一你想知道它没有副作用。

【讨论】:

  • 不鼓励使用 exclude,因为稍后您可能会在模型中添加另一个字段,并意外将该信息泄漏到表单中。
  • 在 django 文档中并不气馁,因为他们提供它是为了从验证中排除字段。请参阅文档。
  • 我也尝试过使用排除,但结果仍然相同。
  • @sha256 不鼓励:参见docs.djangoproject.com/en/dev/topics/forms/modelforms/… 强烈建议您使用 fields 属性明确设置应在表单中编辑的所有字段。
  • @sha256 当表单意外允许用户设置某些字段时,如果不这样做很容易导致安全问题,尤其是在向模型添加新字段时。另一种方法是自动包含所有字段,或仅将一些字段列入黑名单。众所周知,这种基本方法的安全性要低得多,并导致主要网站(例如 GitHub)上的严重漏洞。
【解决方案3】:

http://www.djangofoo.com/67/changing-request-post-values-querydict-immutable

试试

...
student = User(username = request.user)
post_values = request.POST.copy()
post_values['student'] = student
basic_form = StudentProfileForm(data=post_values)
.......

【讨论】:

  • 不,没有用。我正在从我的 ModelForm 中删除学生,所以这个方法会告诉我一个错误。错误:
    • 学生
      • 选择一个有效选项。该选项不是可用选项之一。
  • @anurag619 >不,它没有出现同样的错误? (此字段为必填项。)学生是否有效?试试post_values['student'] = student.pk
  • 这可能可行,但最好不要使用复制() POST,因为这不是规范的做事方式。
  • @user3535644 - 我对您的解决方案进行了一些尝试,但没有奏效。我在某种程度上同意我们的观点。我真正的问题是,当我没有将它包含在表单中时,为什么仍然显示“学生”字段。?
  • stackoverflow.com/questions/5706040/…试试class StudentProfileForm(forms.ModelForm): class Meta: model = StudentProfile exclude = ('student',)
猜你喜欢
  • 2011-08-08
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 2015-11-22
  • 2011-11-25
  • 2011-01-31
相关资源
最近更新 更多