iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0
Python

Django - 製作網頁一點通系列 第 27

Day27 - 多人共享任務功能實作

  • 分享至 

  • xImage
  •  

我們接下來會建立以下幾個頁面

  • 首頁
  • 登入頁面
  • 註冊頁面
  • 任務頁面

昨天我們做了刪除任務的icon,今天來做共享任務的表單。

  1. URL
    首先,在 urls.py 文件中,我們使用 path() 定義了一個路徑,並綁定到 share_task 函數。這個路徑的作用是處理分享任務的請求,並傳遞一個 id 參數(這裡使用的是 slug,通常是數字或字母組成的唯一標識符)。
path('task/share/<slug:id>/',share_task),
  1. share_task

views.py 中,我們定義了 share_task 函數,這裡的主要邏輯是允許使用者通過輸入其他使用者名稱來分享任務。

  • 處理 POST 請求:如果收到來自表單的 POST 請求,會進行以下邏輯處理:
  • 檢查表單有效性:驗證表單資料。
  • 檢查是否重複分享:防止重複分享同一任務給同一使用者,並避免將任務分享給自己。
  • 創建共享記錄:通過 SharedTask.objects.create 將共享的任務保存到資料庫。
@login_required
def share_task(request,id):
    user = request.user
    tasks = Task.objects.filter(user_id=user)
    # 取得共享的任務
    sharedTasks = SharedTask.objects.filter(Q(user=user) | Q(task__user_id=user))
    # 排除共享任務後的我的任務
    my_tasks = tasks.exclude(id__in=sharedTasks.values_list('task__id', flat=True))

    task = Task.objects.get(id=id)
    if request.method == 'POST':
        form = ShareForm(request.POST)  
        if form.is_valid():
            try:
                user_name = form.cleaned_data['user'].strip()
                username = User.objects.get(username=user_name)

                # 检查是否已存在相同的共享任务
                existing_shared_task = SharedTask.objects.filter(task=task, user=username).first()
                if existing_shared_task or user==username:
                    error_message = "該使用者已經共享此任務"
                    return render(request, 'edit_task.html', locals())

                try:
                    share_id = SharedTask.objects.latest('id').id + 1
                except:
                    share_id = 0
                SharedTask.objects.create(id=share_id, task=task, user=username)
                add_log(task, user, f"{user.username}分享給{username.username}")
                return redirect('task')  # 重定向到任務列表頁面
            except Exception as e:
                error_message = "沒有該名使用者"
                return render(request, 'edit_task.html', locals())
    else:
        form = ShareForm()  
    action = "分享"

    return render(request, 'edit_task.html', locals())
  1. ShareForm

forms.py 中定義了 ShareForm,該表單用於輸入想要分享任務的使用者名稱。

class ShareForm(forms.Form):
    user = forms.CharField(label='使用者名稱', max_length=100)

共享任務前
https://ithelp.ithome.com.tw/upload/images/20241011/20169478TSfLIj3cNe.png

共享表單
https://ithelp.ithome.com.tw/upload/images/20241011/20169478CPzXesTBM5.png

共享後
https://ithelp.ithome.com.tw/upload/images/20241011/20169478hDR06SBr6s.png


上一篇
Day26 - 任務刪除功能實作
下一篇
Day28 - 任務留言功能實作
系列文
Django - 製作網頁一點通28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言