0

カスタム フォーム (既定のモデル フォームのみ) を作成した経験があまりなく、ここで助けを求めています。ユーザーから「feed_url」を取得するフォームを作成しようとしています。既に存在する場合は、UserFeed モデルに参照を追加するだけです。存在しない場合は、Feed モデルに追加し、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',)

フォーム

class UserFeedForm(forms.Form):
    feed_url = forms.URLField()
    title = forms.CharField(max_length=64)
    category = forms.ModelChoiceField(Category)
    user = forms.HiddenInput()

ビュー

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.save(commit=False)
            if form.fields['feed_url'] in feeds:
                ##### add to Feed object and add reference to UserFeed object
                feed.user = request.user
                feed.save()
            else:
                ##### get id from Feed object and add reference to UserFeed object
                feed.user = request.user
                feed.save()
            return HttpResponseRedirect("/reader/manage")
    else:
        form = UserFeedForm()
        form.fields['category'].queryset = categories
    context = {'form': form,}
    return expand_context_and_render(request, context, 'reader/form.html')

誰かが私を正しい方向に向けてもらえますか? ありがとう

更新 今、次のようにビューとフォームを更新しました:

フォーム

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

近づいていると思いますが、まだ機能せず、次のエラーが表示されます: "u' http://feeds.bbci.co.uk/news/rss.xml '": "UserFeed.feed " は "フィード" インスタンスでなければなりません。"

どうすればこれを修正できますか?ありがとう

4

3 に答える 3

0

あなたが探しているロジックは次のとおりです。

  1. フィードが存在するかどうかを確認します。
  2. 存在する場合は、それをフェッチします。
  3. 新しいフィードを作成しない場合。
  4. フィードをUserFeedオブジェクトに関連付けます。

このget_or_createメソッドはパート 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")
于 2013-11-04T06:14:09.457 に答える
0

この質問と、ドキュメントのインライン フォームセットを見てみてください。

さらに、UserFieldForm では、feedとして定義されていURLFieldます。したがって、あなたの見解では、次の行で:

feed = form.get_cleaned_data.get('feed')

フィード変数は単なる文字列であり、実際には Feed オブジェクトではありません。これは、エラーが発生している可能性がある場所ですか? それinline formsetsがあなたを助けることができるところです。また、この行は、すべての Feed インスタンスのクエリセットであるのに対し、 は単なる文字列であるif feed in feeds:ため、ステートメントを無意味にします。これにより、ビューが常にブロックになってしまうと思いますか?feedfeedselse

私自身 Django は初めてですが、これがお役に立てば幸いです。

于 2013-11-04T06:07:59.630 に答える
0

私は最終的に次のように動作するようになりました:

フォーム

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

以下の回答からの両方のヒントは、私を正しい方向に向けました。ありがとう !

于 2013-11-06T22:21:42.393 に答える