【发布时间】: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