web-dev-qa-db-ja.com

ForeignKeyからCreateViewに初期値を設定します(non-self.request.user)

クラスベースビューCreateViewでForeignKeysにアクセスしようとしています。 ForeignKeysからCBVに初期値を動的に設定し、ForeignKeysからテンプレートリンクを動的に設定できるようにしたいと思います。

これらの2つの質問(1.初期値、2。テンプレートリンク)は、同様の方法で、またはおそらく異なる方法で解決される可能性があります...私はまだ学習中です。おそらく、最初の質問は_views.py_内で解決でき、2番目の質問は_ingredient_form.html_のテンプレート構文で解決できますか?

SOユーザーからの初期値の設定(_self.request.user_)に関する質問を見ましたが、_models.py_の通常の外部キーだけからではありません。

Django-by-errors を実行していて、機能を追加してDjangoの知識を拡張しようとしています。

私の質問は、特にviews.py:IngredientAddView(CreateView)、_ingredient_form.html_、および_urls.py:'recipe-detail'_&_'ingredient-add_ 'に焦点を当てています。

_'recipe-detail'_を表示すると、_'ingredient-add'_へのリンクをクリックできます。 _'ingredient-add'_に、どのレシピがクリックされたかを「認識」させ、このレシピを初期値として設定できるようにし(views.py:IngredientAddView:get_initials(self)内での試行は機能しません)、また、このレシピに戻ってリンクします(_ingredient_form.html:{% comment %}_内での私の試みは機能しません)。

どんな援助もいただければ幸いです。

models.py

_class Food(models.Model):
    name=models.CharField(max_length=20,unique=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('food-detail',kwargs={'pk':self.pk})

class Recipe(models.Model):
    title=models.CharField(max_length=80,unique=True)
    slug=models.SlugField(max_length=80,unique=True)
    description=models.TextField(blank=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('recipe-detail',kwargs={'slug':self.slug})

class Ingredient(models.Model):
    recipe=models.ForeignKey(Recipe)
    food=models.ForeignKey(Food)

    def __str__(self):
        return '%s (%s)' % (self.food, self.recipe)
_

views.py

_class FoodListView(ListView):
    model=Food

class FoodDetailView(DetailView):
    model=Food

class FoodCreateView(CreateView):
    model=Food

class RecipeListView(ListView):
    model=Recipe

class RecipeDetailView(DetailView):
    model=Recipe

class RecipeCreateView(CreateView):
    model=Recipe

class RecipeUpdateView(UpdateView):
    model=Recipe

class IngredientAddView(CreateView):
    model=Ingredient

#    def get_context_data(self,**kwargs):
#        context=super(IngredientAddView,self).get_context_data(**kwargs)
#        context['foreign']=self.request.session.get('slug')

    def get_initials(self):
        return {
            'recipe':self.request.session.get('recipe')
        }
_

urls.py

_from .views import FoodListView, FoodDetailView, FoodCreateView, RecipeListView, RecipeDetailView, RecipeCreateView, RecipeUpdateView, IngredientAddView

urlpatterns=patterns('',
                     url(r'^$',RecipeListView.as_view(),name='recipe-list'),
                     url(r'^(?P<slug>[-\w]+)$',RecipeDetailView.as_view(),name='recipe-detail'),
                     url(r'^(?P<slug>[-\w]+)/edit$',RecipeUpdateView.as_view(),name='recipe-edit'),
                     url(r'^(?P<slug>[-\w]+)/add_ingredient/$',IngredientAddView.as_view(),name='ingredient-add'),
                     url(r'^new/$',RecipeCreateView.as_view(),name='recipe-create'),
                     url(r'^food/$',FoodListView.as_view(),name='food-list'),
                     url(r'^food/(?P<pk>[\d]+)$',FoodDetailView.as_view(),name='food-detail'),
                     url(r'^food/create/$',FoodCreateView.as_view(),name='food-create'),
                 )
_

レシピ詳細.html

_{% extends "base_food.html" %}

{% block title %}{{ recipe }} {% endblock %}

{% block content %}
  <h1>{{ recipe }}</h1>
  <p>{{ recipe.id }}</p>
  <p>{{ recipe.title }}</p>

  <br>
    <h2>Description</h2>
  <p>{{ recipe.description|default:'No description' }}</p>

  <h2>Ingredients</h2>
  <ul>
    {% for ingredient in recipe.ingredient_set.all %}
      <li>{{ ingredient }}</li>
  {% endfor %}
  </ul>
  <p><a href="{% url 'ingredient-add' recipe.slug %}">Add ingredient</a></p>
  <p><a href="{% url 'recipe-edit' recipe.slug %}">Edit recipe</a></p>
  <p><a href="{% url 'recipe-list' %}">Back to recipe list</a></p>
{% endblock %}
_

成分_フォーム.html

_{% extends "base_food.html" %}

{% block title %}Add Ingredient{% endblock %}

{% block content %}
  <h1>Add Ingredient</h1>
  <form method="POST">{% csrf_token %}
    {{ form }}
    <button type="submit" class="btn btn-primary">Save</button>
  </form>

{%comment%}  <p><a href="{% url 'recipe-detail' recipe.slug %}">Back to detail</a></p> {%endcomment%}
  <p><a href="{% url 'recipe-list' %}">Back to recipe list</a></p>
{% endblock %}
_
18
Jeremiah

レシピをインスタンス化する必要があります。

class IngredientAddView(CreateView):
    model=Ingredient

    def get_initial(self):
        recipe = get_object_or_404(Recipe, slug=self.kwargs.get('slug'))
        return {
            'recipe':recipe,
        }
32
Berislav Lopac