【问题标题】:Django: Show different button in template if user object existsDjango:如果用户对象存在,则在模板中显示不同的按钮
【发布时间】:2020-09-29 14:00:02
【问题描述】:

如果用户已经添加了一个对象,我想显示一个按钮,如果他/她还没有添加另一个按钮。

在我的模板中我有:

         <tr>
          {% for word in dict_list %}
          <td>{{word.target_word}} </td>
          <td>{{word.source_word}}</td>
          <td>
            <a href="javascript:" class="add-word btn btn-warning btn-sm" data-wordpk="{{word.pk}}">Add</a>
         {% if user_word %}
            <a href="" class="add-word btn btn-success btn-sm" >Added</a>
         {% endif %}
          </td>
        </tr>
        {% endfor %}

在我看来:

def custom_create_word(request, object):
    if request.method == 'POST':
        pass
    if request.method =="GET":
        from .forms import WordForm
        from .models import Word
        word = Word.objects.get(pk=object)
        user = request.user
        target_word = word.target_word
        source_word = word.source_word
        deck_name = "My Words"
        fluency = 0
        new_word, created = Word.objects.get_or_create(user=user, target_word=target_word,
                                     source_word=source_word, deck_name=deck_name, fluency=fluency)

    return HttpResponseRedirect(reverse('vocab:dict'))

    def get_context_data(self,**kwargs):
        context = super(custom_create_word, self).get_context_data(**kwargs)
        if Word.objects.filter(target_word=target_word, user=user).exists():
            user_word == True
            context['user_word'] = user_word
        return context

我没有收到任何错误,但我也没有得到想要的结果。我是不是走错了路?

更新模板:

  <tbody>
        <tr>
          {% for word in dict_list %}
          <td>{{word.target_word}}</td>
          <td>{{word.source_word}}</td>
          <td>
          {% if user_word %}
            <a href="" class="btn btn-success btn-sm" >Added</a>
          {% else %}
              <a href="javascript:" class="add-word btn btn-warning btn-sm" data-wordpk="{{word.pk}}">Add</a>
         {% endif %}
          </td>
        </tr>
        {% endfor %}
        </tbody>

更新视图:

class Dictionary(FilterView):
    model = Word
    template_name = 'vocab/dictionary.html'
    context_object_name = 'dict_list'
    paginate_by = 15
    filterset_class = WordFilter
    strict = False

    def get_queryset(self):
        qs = self.model.objects.filter(user__username__iexact='special_user')
        return qs

    def get_object(self):
        queryset = qs
        pk = self.kwargs.get('pk')
        if pk is None:
            raise AttributeError('pk expected in url')
        return get_object_or_404(queryset, pk=pk)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['filter'] = WordFilter(self.request.GET, queryset=self.get_queryset())
        word = Word.objects.get(pk=self.kwargs.get('pk'))
        target_word = word.target_word
        context['user_word'] = Word.objects.filter(target_word=target_word, user=self.request.user).exists()
        return context

更新:如果我在上面对 pk 进行硬编码,我会得到想要的结果,即如果单词不存在则添加,如果存在则添加。但是pk=self.kwargs.get('pk') 不起作用,我得到了 DoesNotExist 错误 - 它应该是什么?如何访问 ListView 中每个对象的 pk?

urls.py:

 app_name='vocab'

    urlpatterns = [
        path("index/",views.VocabHome.as_view(),name='index'),
        path("list/", views.WordList.as_view(), name="list"),
        path("create/", views.CreateWord.as_view(), name="create"),
        re_path(r"by/(?P<username>[-\w]+)/(?P<pk>\d+)/$",views.WordDetail.as_view(),name="detail"),
        re_path(r"delete/(?P<pk>\d+)/$",views.WordDelete.as_view(),name="delete"),
        re_path(r"edit/(?P<pk>\d+)/$",views.WordUpdate.as_view(),name="edit"),
        path('dictionary/', views.Dictionary.as_view(),name='dict'),
        path("<int:object>/",views.custom_create_word,name="add-custom"),
    ]

我现在也尝试了以下方法:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['filter'] = WordFilter(self.request.GET, queryset=self.get_queryset())
    special_user_word = Word.objects.filter(user__username__iexact='special_user', target_word='target_word')
    logged_user_word = Word.objects.filter(user=self.request.user, target_word='target_word')
    user_word = None
    if special_user_word == logged_user_word:
        user_word = True
    context['user_word'] = user_word
    return context

但我到处都收到None...有什么想法吗?

【问题讨论】:

    标签: python html django python-3.x django-views


    【解决方案1】:

    你能分享 url 的文件吗,在更新后的视图中我看不到函数是如何被调用的以及调用了哪个函数。

    【讨论】:

    • 我已经添加了。
    • 在新的 django 中,url 更改为如下。
    • re_path("edit/",views.WordUpdate.as_view(),name="edit"),
    • 好的,但这与我的问题无关。
    【解决方案2】:

    这是user_word = True,而不是user_word == True

    此外,在您的模板中,您应该使用 else 子句,否则当 user_wordTrue 时,您将有 2 个按钮。

    最后,def get_context_data(self,**kwargs): 将不会被执行,因为您将函数用作视图。 get_context_data 用于基于通用类的视图。即使它被执行,我猜它不是,你在其中使用的target_word 没有定义。

    为您更新新问题

    替换 word = Word.objects.get(pk=self.kwargs.get('pk'))word = Word.objects.get(pk=kwargs.get('pk'))

    【讨论】:

    • 我原来是这样的,但没用。我将其更改为 '==' 只是为了看看它是否可行。
    • 请准确提供您遇到的错误。例如你的 user_word 变量里面有什么
    • 就像我说的,没有错误。但是当我将{{user_word}} 放入模板时,什么也没有出现。所以我的观点一定有问题,但我不知道是什么。
    • 你是对的,这是错误的观点。请查看我更新的问题,尤其是更新的视图。如果我硬编码它现在可以工作,但是我怎样才能正确获得 pk?
    猜你喜欢
    • 2019-04-05
    • 2017-09-24
    • 2012-09-05
    • 1970-01-01
    • 2020-01-02
    • 2012-04-21
    • 1970-01-01
    • 2020-07-05
    • 2013-04-27
    相关资源
    最近更新 更多