Django редактирование экземпляра модели не может найти экземпляр - PullRequest
0 голосов
/ 22 января 2020

Я делаю книгу рецептов. По какой-то причине, всякий раз, когда я пытаюсь извлечь рецепт из БД для его редактирования, я получаю сообщение об ошибке, когда не удается найти указанный мной рецепт. Я использую слагов, и моя логика c заключается в том, что я перехожу из detailView, где я уже извлек информацию о БД, в updateView. Я пытаюсь передать объект рецепта, который я уже вытащил из detailView, в updateView, но когда я это делаю, он все время говорит мне, что не может найти указанный рецепт.

views.py: Базовые представления, которые я здесь называю, предоставляют только способ публикации по умолчанию для обработки поиска, поэтому мне не нужно вставлять его для каждого создаваемого представления, поэтому у меня есть возможность повторного использования кода

class RecipeDetailView(BaseDetailView):
    model = Recipe
    template_name = 'RecipeBook/recipe_detail.html'
    context_object_name = 'recipe_view'
    queryset = None
    slug_field = 'slug'
    slug_url_kwarg = 'slug'

    def get_context_data(self, *args, **kwargs):
        context = super(RecipeDetailView, self).get_context_data()
        recipe = self.object
        recipe.ingredients = recipe.ingredients_list.split('\n')

        context['recipe'] = recipe

        return context

class RecipeEditView(BaseUpdateView):
    model = Recipe
    template_name = 'RecipeBook/edit_recipe.html'
    context_object_name = 'recipe_edit'
    queryset = None
    slug_field = 'slug'
    slug_url_kwarg = 'slug'
    form_class = RecipeForm

    def get_context_data(self, *args, **kwargs):
        context = super(RecipeEditView, self).get_context_data()
        recipe = self.object
        print(recipe.name)
        recipe.ingredients = recipe.ingredients_list.split('\n')
        recipe.categories_list = ""
        categories = Category.objects.filter(recipe=recipe)
        for category in categories:
            if category != categories[-1]:
                recipe.categories_list += (category + ", ")
            else:
                recipe.categories_list += category

        recipe_edit_form = RecipeForm(initial={'name': recipe.name, 'ingredients_list': recipe.ingredients,
                                               'directions': recipe.directions, 'prep_time': recipe.prep_time,
                                               'cook_time': recipe.cook_time, 'servings': recipe.servings,
                                               'source': recipe.source, 'category_input': recipe.categories_list})
        context['recipe'] = recipe
        context['recipe_edit_form'] = recipe_edit_form

        return context

models.py:

class Recipe(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, default="")
    ingredients_list = models.TextField(default="")
    servings = models.IntegerField(default=0, null=True, blank=True)
    prep_time = models.IntegerField(default=0, null=True, blank=True)
    cook_time = models.IntegerField(default=0, null=True, blank=True)
    directions = models.TextField(default="")
    source = models.CharField(max_length=100, default="", null=True, blank=True)
    categories = models.ManyToManyField(Category, blank=True)
    slug = models.CharField(max_length=200, default="")

    def __str__(self):
        return self.name

urls.py

# ex: /Recipes/Grilled_Chicken/
    path('Recipes/<slug>/', views.RecipeDetailView.as_view(), name='view_recipe'),
    path('Recipes/<path:slug>/', views.RecipeDetailView.as_view(), name='view_recipe'),
    # ex: /Recipes/edit/Steak/
    path('Recipes/edit/<slug>/', views.RecipeEditView.as_view(), name='edit_recipe'),
    path('Recipes/edit/<path:slug>/', views.RecipeEditView.as_view(), name='edit_recipe'),

ссылка в recipe_detail. html:

<a href="{% url 'RecipeBook:edit_recipe' recipe.slug %}" style="float: right">Edit Recipe</a>

Я был схожу с ума, пытаясь понять это. Из всего, что у меня есть, рецепт, который я извлекаю в detailView, должен быть в состоянии передать в editView, но каждый раз, когда я пытаюсь открыть страницу edit_recipe, он постоянно говорит мне, что не может найти указанный рецепт. URL-адрес, который он генерирует, показывает правильный слаг и ссылку, хотя и должен. Я не знаю, чего мне не хватает в этот момент ...

Ответы [ 2 ]

0 голосов
/ 23 января 2020

В итоге мне пришлось go вернуться назад и изменить представление на DetailView. Это был единственный способ, с помощью которого я мог протолкнуть экземпляр рецепта. Есть что-то очень специфическое c в использовании вида обновления с моделями, которые не очень понятны ...

После перехода на DetailView страница будет заполняться формой, инициализированной значениями рецепта. Затем я мог бы внести изменения, чтобы убедиться, что все работает оттуда.

Спасибо тем, кто откликнулся, по крайней мере, мой мозг работал в другом направлении, чтобы выяснить это.

0 голосов
/ 22 января 2020

Попробуйте так:

<a href="{% url 'RecipeBook:edit_recipe' recipe_view.slug %}" style="float: right">Edit Recipe</a>
...