Django表单验证和对两个模型的操作

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

我在构建自定义表单(仅默认模型表单)方面没有太多经验,我在这里寻求一些帮助。我试图构建一个表单,从用户那里获取“feed_url”,如果它已经存在,只需将引用添加到UserFeed模型中即可。如果它不存在,它应该将它添加到提要模型中,并在UserFeed模型中引用它

模型

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
    对象关联
  • 该方法不包含第1-3部分,因此您需要以下内容:

    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')