我使用模板創建了一個使用 Django 的日歷,但現在我堅持將此日歷上的事件視圖限制為僅創建該事件的用戶。
我沒有此日歷的模型,僅用于事件,日歷當前基于我的 util.py 檔案:
實用程式.py
class Calendar(HTMLCalendar):
def __init__(self, year=None, month=None):
self.year = year
self.month = month
super(Calendar, self).__init__()
# formats a day as a td
# filter events by day
def formatday(self, day, events):
contracts_starting_per_day = events.filter(starting_date__day=day)
contracts_ending_per_day = events.filter(ending_date__day=day)
contracts_paying_per_day = events.filter(payment_date__day=day)
d = ''
for contract in contracts_starting_per_day:
if contract.company_client:
client = contract.company_client
elif contract.person_client:
client = contract.person_client
else:
client = '-'
d = f"<a href='http://127.0.0.1:8000/contracts/editct/{contract.id}'> <li class='calendar-li starting' title='{contract.contract_name}'> {contract.contract_name} <p class='calendar-p'> {client} </p> </li> </a>"
if day != 0:
return f"<td class='calendar-td'><span class='date'>{day}</span><ul class='calendar-ul'> {d} </ul></td>"
return "<td class='calendar-td'></td>"
# formats a week as a tr
def formatweek(self, theweek, events):
week = ''
for d, weekday in theweek:
week = self.formatday(d, events)
return f"<tr class='calendar-tr'> {week} </tr>"
# formats a month as a table
# filter events by year and month
def formatmonth(self, withyear=True):
contracts = Contract.objects.filter(starting_date__year=self.year, starting_date__month=self.month)
cal = f'<table border="0" cellpadding="0" cellspacing="0" >\n'
cal = f'{self.formatmonthname(self.year, self.month, withyear=withyear)}\n'
cal = f'{self.formatweekheader()}\n'
for week in self.monthdays2calendar(self.year, self.month):
cal = f'{self.formatweek(week, contracts)}\n'
return cal
視圖.py
class CalendarView(LoginRequiredMixin, generic.ListView):
model = Contract
template_name = 'calendar.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Get the actual month to display the calendar
d = get_date(self.request.GET.get('month', None))
agenda = Calendar(d.year, d.month)
html_agenda = agenda.formatmonth(withyear=True)
#context['calendar'] = context['calendar'].filter(user=self.request.user)
context['calendar'] = mark_safe(html_agenda)
context['prev_month'] = prev_month(d)
context['next_month'] = next_month(d)
return context
def get_date(req_day):
if req_day:
year, month = (int(x) for x in req_day.split('-'))
return date(year, month, day=1)
return datetime.today()
def prev_month(d):
first = d.replace(day=1)
prev_month = first - timedelta(days=1)
month = 'month=' str(prev_month.year) '-' str(prev_month.month)
return month
def next_month(d):
days_in_month = calendar.monthrange(d.year, d.month)[1]
last = d.replace(day=days_in_month)
next_month = last timedelta(days=1)
month = 'month=' str(next_month.year) '-' str(next_month.month)
return month
我已經嘗試過#context['calendar'] = context['calendar'].filter(user=self.request.user)我的觀點,但我遇到了這個錯誤:
/agenda/calendar '日歷'處的 KeyError
僅當登錄的用戶和創建事件的用戶相等時,是否有任何選項可以限制日歷上的事件?
我也嘗試過:
for contract in contracts_starting_per_day:
if contract.user == request.user:
在我的日歷實用程式上,但由于此實用程式沒有收到任何請求,因此無法使用它。
uj5u.com熱心網友回復:
您正在嘗試calendar從背景關系中檢索它尚未在背景關系中。此行導致錯誤:
context['calendar'] = context['calendar'].filter(user=self.request.user)
get_queryset您應該在View 方法中為您的模型定義查詢集。該查詢集將可以在您設定的變數的背景關系中訪問context_object_name:
class CalendarView(...):
...
context_object_name = 'contracts'
def get_queryset(self):
return Contract.objects.filter(user=self.request.user)
然后在模板中:
{% for contract in contracts %}
{{ contract }}
{% endfor %}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/479985.html
標籤:django
