Ben*_*n S 4 django unique save
我不知道我是否正在以正确的方式解决问题.预期结果是具有仅显示name和的表单description.一旦用户提交表单我想添加当前用户owner并检查是否已经有一个具有相同name和的条目user.如果有,我想返回有错误的表单.如果没有,我想保存Status.
我的模特:
class Status(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(blank=True)
owner = models.ForeignKey(User)
active = models.BooleanField(default=True)
class Meta:
unique_together = ('name','owner')
Run Code Online (Sandbox Code Playgroud)
我的看法:
def settings_status(request):
status_form = StatusForm()
if request.method == 'POST':
status_form = StatusForm(request.POST)
if status_form.is_valid():
new_status = Status()
new_status.name = status_form.cleaned_data['name']
new_status.description = status_form.cleaned_data['description']
new_status.owner = request.user
new_status.save()
return render_to_response('base/settings_status.html',{
'status_form' : status_form,
}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
我已经试了无数的东西,但我一直运行到这个问题,如果我添加owner到对象分开那么它是不是适用于模型的clean功能,因此不能被用来检查name和owner是唯一的.
几种方法:
例如,将用户(所有者)传递给表单:
forms.py:
class StatusForm(forms.Form):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user','')
super(StatusForm, self).__init__(*args, **kwargs)
self.fields['name'] = forms.CharField(label='Name')
self.fields['description'] = CharField(label='Description', widget=forms.Textarea)
def clean(self):
cleaned_data = self.cleaned_data
name = cleaned_data.get('name')
if Status.objects.filter(name=name, owner=self.user).exists():
self._errors['name'] self.error_class(['Status with this name exists'])
return cleaned_data
Run Code Online (Sandbox Code Playgroud)
views.py:
def settings_status(request):
if request.method == 'POST':
status_form = StatusForm(request.POST, user=request.user)
if status_form.is_valid():
new_status = Status()
new_status.name = status_form.cleaned_data['name']
new_status.description = status_form.cleaned_data['description']
new_status.owner = request.user
new_status.save()
else:
status_form = StatusForm(user=request.user)
context = {'status_form':status_form,}
return render_to_response('base/settings_status.html', context,
context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
另请参阅根据表单设置设置初始数据,并考虑使用ModelForm.
| 归档时间: |
|
| 查看次数: |
3889 次 |
| 最近记录: |