Django表单验证和对两个模型的操作
我在构建自定义表单(仅默认模型表单)方面没有太多经验,我在这里寻求一些帮助。我试图构建一个表单,从用户那里获取“feed_url”,如果它已经存在,只需将引用添加到UserFeed模型中即可。如果它不存在,它应该将它添加到提要模型中,并在UserFeed模型中引用它 模型Django表单验证和对两个模型的操作,django,django-forms,Django,Django Forms,我在构建自定义表单(仅默认模型表单)方面没有太多经验,我在这里寻求一些帮助。我试图构建一个表单,从用户那里获取“feed_url”,如果它已经存在,只需将引用添加到UserFeed模型中即可。如果它不存在,它应该将它添加到提要模型中,并在UserFeed模型中引用它 模型 class Category(models.Model): name = models.CharField(unique=False, max_length=64) user = models.ForeignK
class Category(models.Model):
name = models.CharField(unique=False, max_length=64)
user = models.ForeignKey(User)
slug = AutoSlugField(populate_from='name', always_update='True', unique_with='user')
def __unicode__(self):
return self.name
class Meta:
ordering = ('name',)
class Feed(models.Model):
feed_url = models.URLField(unique=True)
def __unicode__(self):
return self.feed_url
class UserFeed(models.Model):
feed = models.ForeignKey(Feed)
title = models.CharField(max_length=64)
category = models.ForeignKey(Category)
user = models.ForeignKey(User)
slug = AutoSlugField(populate_from='title', always_update='True', unique_with='user')
def __unicode__(self):
return self.title
class Meta:
ordering = ('title',)
形式
观点
谁能给我指一下正确的方向吗?
谢谢
更新
现在,我更新了我的视图和表单,如下所示:
形式
观点
我想我越来越接近了,但它仍然不起作用,这给了我一个错误:
无法分配“u”:“UserFeed.feed”必须是“feed”实例
你知道我该怎么解决这个问题吗?
谢谢试着看看这个,也看看文档
此外,在UserFieldForm中,提要
被定义为URLField
。因此,在您看来,在这一行:
feed = form.get_cleaned_data.get('feed')
feed变量只是一个字符串,实际上不是feed对象。这就是可能发生错误的地方?这就是内联表单集
可以帮助您的地方。此外,这一行还使您的if-feed-in-feed:
语句没有意义,因为feed
只是一个字符串,而feed
是所有feed实例的查询集。我认为这将导致您的视图始终位于else
块中
我本人是Django的新手,但我希望这对您有所帮助。您需要的逻辑是:
UserFeed
对象关联if form.is_valid():
obj = form.save(commit=False)
feed = form.cleaned_data.get('feed')
feed_obj, created = Feed.objects.get_or_create(feed_url=feed)
obj.feed = feed_obj
obj.save()
return HttpResponseRedirect("/reader/manage")
我终于让它这样工作了: 形式 观点
下面的两个答案都为我指明了正确的方向。谢谢 你到底有什么问题?你不明白什么?基本上,在这两个部分中,我添加了两条注释,我不确定如何使用
form.save()
你应该使用modelForm
@Rohan-是的,这是一个很好的观点,但总的来说,我仍然觉得这似乎是一个很好的解决方案,但尽管有“obj.feed=feed\u obj”出于某种原因,它仍然将feed视为字符串。我仍然收到这个错误:“无法分配“u”“:“UserFeed.feed”必须是一个“feed”实例。你知道吗?你可能已经在其他地方重新分配了feed\u obj
。不,我仔细检查了,情况并非如此。你知道其他解决方法吗?
class UserFeedForm(forms.ModelForm):
feed = forms.URLField()
title = forms.CharField(max_length=64)
category = forms.ModelChoiceField(Category)
user = forms.HiddenInput()
class Meta:
model = UserFeed
fields = ['feed', 'title', 'category']
def addfeed(request):
categories = Category.objects.filter(user=request.user)
feeds = Feed.objects.all()
if request.method == 'POST':
form = UserFeedForm(request.POST)
form.fields['category'].queryset = categories
if form.is_valid():
feed = form.cleaned_data.get('feed')
if feed in feeds:
##### get id from Feed and add reference to UserFeed
existing_feed = Feed.objects.get(feed_url=feed)
form.feed = existing_feed.id
form.user = request.user
form.save(commit=True)
else:
##### add to Feed object and then add reference to UserFeed object
Feed.object.create(feed_url=feed)
existing_feed = Feed.objects.get(feed_url=feed)
form.feed = existing_feed.id
form.user = request.user
form.save(commit=True)
return HttpResponseRedirect("/reader/manage")
else:
form = UserFeedForm()
form.fields['category'].queryset = categories
context = {'page_title': page_title,
'form': form,
}
return expand_context_and_render(request, context, 'reader/form.html')
feed = form.get_cleaned_data.get('feed')
if form.is_valid():
obj = form.save(commit=False)
feed = form.cleaned_data.get('feed')
feed_obj, created = Feed.objects.get_or_create(feed_url=feed)
obj.feed = feed_obj
obj.save()
return HttpResponseRedirect("/reader/manage")
class UserFeedForm(forms.Form):
feed = forms.URLField()
title = forms.CharField(max_length=64)
category = forms.ModelChoiceField(Category)
user = forms.HiddenInput()
class Meta:
model = UserFeed
fields = ['feed', 'title', 'category']
def addfeed(request):
user = request.user
categories = Category.objects.filter(user=request.user)
if request.method == 'POST':
form = UserFeedForm(request.POST)
form.fields['category'].queryset = categories
if form.is_valid():
feed = form.cleaned_data['feed']
category = form.cleaned_data['category']
title = form.cleaned_data['title']
feed_obj, created = Feed.objects.get_or_create(feed_url=feed)
obj = UserFeed(feed=feed_obj, title=title, category=category, user=user)
obj.save()
return HttpResponseRedirect("/reader/manage")
else:
form = UserFeedForm()
form.fields['category'].queryset = categories
context = {'page_title': page_title,
'form': form,
}
return expand_context_and_render(request, context, 'reader/form.html')