【问题标题】:set initial value in CreateView from ForeignKey (non-self.request.user)从 ForeignKey (non-self.request.user) 在 CreateView 中设置初始值
【发布时间】:2013-08-19 02:29:32
【问题描述】:

我正在尝试在基于类的视图 CreateView 中访问外键。我希望能够从 ForeignKeys 动态设置 CBV 中的初始值,并从 ForeignKeys 动态设置模板链接。

这两个问题(1.初始值,2.模板链接)可以用类似的方法解决,也可以用不同的方法解决……我还在学习中。也许第一个问题可以在views.py 中解决,第二个问题可以在ingredient_form.html 中使用模板语法解决?

我从用户 (self.request.user) 那里看到了关于 SO 设置初始值的问题,但不仅仅是来自 models.py 中的普通外键。

我正在浏览 django-by-errors,并尝试添加额外的功能来扩展我的 django 知识。

我的问题特别集中在views.py:IngredientAddView(CreateView),关于 ingredient_form.htmlurls.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'),
                 )

recipe_detail.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 %}

ingredient_form.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 %}

【问题讨论】:

  • 我认为完成您所要求的简单方法是在其中包含一个带有recipe-detail pk 的网址。像/your_url/13 这样的东西。然后视图可以使用该 pk 分配特定的 FK 实例。
  • 我同意为 url 使用 pk 更容易——但我设想一个使用有意义的 url 对用户友好的 web 应用程序。我还想扩展我对 django 的了解。

标签: django django-templates foreign-keys django-class-based-views


【解决方案1】:

您需要实例化您的配方:

class IngredientAddView(CreateView):
    model=Ingredient

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

【讨论】:

  • 宾果游戏。这行得通。谢谢你。为了将来参考,函数实际上是 get_initial(self) 但这是我最初的错字的错。
  • 你是对的,我已经确定了答案。我也写出了我的头。 :-)
猜你喜欢
  • 2020-10-31
  • 1970-01-01
  • 2012-05-10
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 2019-03-01
  • 1970-01-01
相关资源
最近更新 更多