我们怎么能让django表单不验证我们是否正在编辑,而不是添加新记录。代码如下:
class PageForm(forms.Form):
name = forms.CharField(max_length=100,widget=forms.TextInput(attrs={'class':'textInput'}))
description = forms.CharField(max_length=300, required=False,widget=forms.TextInput(attrs={'class':'textInput'}))
body = forms.CharField(widget=forms.Textarea)
template = forms.CharField(max_length=30,widget=forms.TextInput(attrs={'class':'textInput'}))
navbar = forms.BooleanField(required=False, widget=forms.Select(choices=(('True','True'),
('False', 'False'))))
publish = forms.BooleanField(widget=forms.Select(choices=(('Published','Publish Now'),
('Private','Private'),
('Draft','Draft'))))
def save(self, page=None, commit=True):
data = self.cleaned_data
if not page:
page = models.Page(key_name=data['name'].replace(' ','-'))
page.name = data['name']
page.description = data['description']
page.body = data['body']
page.template = data['template']
page.publish = data['publish']
if commit: page.put()
return page
# prevent the same page 's name
def clean_name(self):
name = self.cleaned_data['name']
query = models.Page.all(keys_only=True)
query.filter('name = ', name)
page = query.get()
if page:
raise forms.ValidationError('Page name "%s" was already used before' % name)
return name
此名称验证的目的是防止具有相同名称的记录。 BUt我发现,它也在编辑时验证,所以我们无法编辑记录,因为它会说'同名的记录已经存在'。
实际上对于编辑,保存功能的页面参数不会是none,而是prev record,并且在保存新的时不会是。但是我们如何在clean_name函数上读取这个参数,以便我们现在可以编辑还是创建它?
非常感谢!
答案 0 :(得分:2)
如果您正在编辑表单,那么表单有一些实例,您可以检查是否存在。
如果是,那么你可能正在编辑现有对象..对吗?
实施例: 如果您正在使用表单编辑对象,则可以像这样创建表单对象:
form = MyForm(instance = myobject)
然后在表单类方法中,您可以检查表单是否已按照此处描述的方式保存实例: Test if Django ModelForm has instance
答案 1 :(得分:2)
在你的clean方法中,你可以使用self.initial来知道它是添加还是编辑。如果正在编辑,则 self.initial 不会为空。但是当它添加时,self.initial 将是前一个值的字典。
答案 2 :(得分:0)
从查询集中排除当前对象
query.filter('name = ', name).exclude(pk=self.pk)
或更改if条件以检查页面和当前对象是否不相同。
答案 3 :(得分:0)
很抱歉,我无法在你的帖子下面发表评论,不知道为什么。
@sunn0:我没有使用django模型,因为在appengine中部署应用程序,所以请改用appengine模型。
@Zayatzz:你可以展示一些代码怎么做?由于我们是在添加还是编辑,我们总是将表单绑定到request.POST验证之前,所以不知道如何区分。
@Ashok:我根据你的建议做了一个解决方法。由于之前我没有将pk传递给form,而是将prev对象作为param传递,因此无法通过使用pk排除。因此,我更改代码并将其他密钥设置为pk(如果创建,则将密钥清空,但如果使用pk编辑填充密钥)并仅检入条件,如果密钥字段不为空,则表示我们正在编辑。不确定这是否是最佳做法,但无论如何都可行。