在同一视图中处理多个不同模型对象时如何将对象ID传递给Django视图

bttbmeg0  于 2023-03-31  发布在  Go
关注(0)|答案(3)|浏览(198)

我正试图使网页应用程序,其中有主页面上的 Jmeter 板,用户可以添加保存的链接,笔记提醒等,我想出了如何使用在同一视图中创建不同的模型对象的几种形式,但是我不能更新那些对象。我特别想做的是有一个按钮窗体,当用户点击那个按钮时(复选框)提醒对象状态更改为已关闭。但我无法找到获取该对象ID的方法或在视图中查询它的任何内容。
我对Django框架非常陌生,这可能是显而易见的,但我找不到任何可以帮助我的信息,我尝试了很多变体来实现这一点,但到目前为止没有任何效果。

型号.py

class Reminders(models.Model):
    person_id = models.ForeignKey(Person, related_name="reminder_about", null=True, blank=True, on_delete=models.CASCADE)
    date = models.DateTimeField(null=True)
    status = models.CharField(max_length=150, null=True, blank=True)
    note = models.CharField(max_length=150, null=True, blank=True)
    user_id = models.ForeignKey(Person, related_name="reminder_for", null=True, blank=True, on_delete=models.CASCADE)

    class Meta:
        verbose_name = 'Reminder'
        verbose_name_plural = 'Reminders'

    def __str__(self):
        return f"{self.status} {self.note}"

查看次数.py

@login_required
def index(request):
    current_user = request.user
    person = Person.objects.get(user=current_user)
    scheduled_calls = ScheduledCalls.objects.filter(user_id=person.id).order_by("-date")
    reminders = Reminders.objects.filter(user_id=person.id).order_by("-date")
    notes = Notes.objects.filter(user_id=person.id).order_by("-date")
    links = SavedLinks.objects.filter(user_id = person.id)

    if request.method == "POST":
        call_form = _get_form(request, CallForm, "call_form_pre")
        link_form = _get_form(request, LinkForm, "link_form_pre")
        note_form = _get_form(request, NotesForm, "note_form_pre")
        reminder_form = _get_form(request, RemindersForm, "reminder_form_pre")
        remindercheck_form = _get_form(request, RemindersForm, "remindercheck_form_pre")

        if call_form.is_bound and call_form.is_valid():
            call_form.instance.user_id = person
            call_form.save(commit=False)
            call_form.save()
            return redirect("home")

        if link_form.is_bound and link_form.is_valid():
            link_form.instance.user_id = person
            link_form.save(commit=False)
            link_form.save()
            return redirect("home")
        
        if note_form.is_bound and note_form.is_valid():
            note_form.instance.user_id = person
            note_form.save(commit=False)
            note_form.save()
            return redirect("home")
        
        if reminder_form.is_bound and reminder_form.is_valid():
            reminder_form.instance.user_id = person
            reminder_form.save(commit=False)
            reminder_form.save()
            return redirect("home")
        
        #this is the part im stuck with     
        if remindercheck_form.is_bound:
            note = request.POST("note")
            reminder = Reminders.objects.filter(note=note)
            reminder.update(status="Closed")
        
    return render(request, "main/home.html", {"person" : person, 
                                              "scheduled_calls" : scheduled_calls, 
                                              "reminders" : reminders, 
                                              "notes" : notes,
                                              "links" : links, 
                                              "call_form" : CallForm(prefix = "call_form_pre"),
                                              "link_form" : LinkForm(prefix = "link_form_pre"),
                                              "note_form" : NotesForm(prefix = "note_form_pre"),
                                              "reminder_form" : RemindersForm(prefix = "reminder_form_pre"),
                                              "remindercheck_form" : RemindersForm(prefix = "remindercheck_form_pre"),
                                              })

超文本标记语言

<div id="tabs" style="overflow-y:scroll; height:14rem;"> 
            {% if reminders %}
                {% for reminder in reminders %}
                <div class="d-flex align-items-center p-0 my-1">
                  <form action="" method="POST">
                    {% csrf_token %}
                    <div class="form-check">
                      <input id="remdone" name="{{remindercheck_form.prefix}}" class="form-check-input" type="checkbox" value="False">
                      <input class="form-check-label" style="border: 0px; background-color: white; color: black;" name="note"
                                value="{{reminder.note}}" disabled>
                      <input name="status" type="text" class="form-control" value="Closed" hidden>
                    </div>
                  </form>
                  <script type='text/javascript'>
                    $(document).ready(function() { 
                      $('input[id=remdone]').change(function(){
                           $('form').submit();
                      });
                     });
                   </script>
                </div>
                {% endfor %}
              {% else %}
              <h5 class="text-center mt-5">You did a good job! No reminders left!</h5>    
              {% endif %}
          </div>

表单.py

class RemindersForm(forms.ModelForm):
    class Meta:
        model = Reminders
        fields = ("note", "person_id", "status")

        widgets = {
            "person_id" : forms.Select(attrs={'class': 'form-control'}),
            "note" : forms.TextInput(attrs={'class': 'form-control'}),
            "status" : forms.TextInput(attrs={'class': 'form-control'}),
            }

    def __init__(self, *args, **kwargs):
        super(RemindersForm, self).__init__(*args, **kwargs)
        self.fields['person_id'].empty_label = " "
        self.fields['person_id'].queryset = Person.objects.all()

编辑

为了更清楚地添加它在前端的外观。当用户点击复选框项目在数据库中的状态应更改为关闭和项目应dissappear从列表中。

2sbarzqh

2sbarzqh1#

首先,你应该注意models.py文件,你使用的是Person模型,我看不到,但它似乎是一个用户自定义的模型。
您不需要为每个提醒添加id,因此您可以像这样重新编码models.py:

型号.py

class Reminders(models.Model):
    user = models.ForeignKey(Person, related_name="reminder_about", null=True, blank=True, on_delete=models.CASCADE)
    date = models.DateTimeField(null=True)
    status = models.CharField(max_length=150, null=True, blank=True)
    note = models.CharField(max_length=150, null=True, blank=True)
    person = models.ForeignKey(Person, related_name="reminder_for", null=True, blank=True, on_delete=models.CASCADE)

    class Meta:
        verbose_name = 'Reminder'
        verbose_name_plural = 'Reminders'

    def __str__(self):
        return f"{self.status} {self.note}"

然后在你的view.py文件中你需要更干净的代码,并使用user对象来填充另一个模型中的外键。
另外,如果你想更新你的views.py文件中的每个模型,请查询数据库并使用update()方法,如下所示:

查看次数.py

if note_form.is_bound and note_form.is_valid():
    new_note_set = models.Note.objects.filter(user=request.user).update(person=person)
    new_note_set.save()

对于端点,通常django开发人员定义一个变量并将其命名为context

context = {
            ...
            "person" : person, 
            "scheduled_calls" : scheduled_calls, 
            ...
        }

return render(request, 'template.html', context)
l7wslrjt

l7wslrjt2#

您可以通过将提醒ID作为表单中的隐藏输入字段传递给表单来解决它。然后,在您的视图中,您可以根据ID检索提醒对象并更新其状态。我确实有同样的问题,之前我使用此技术进行了修复。这样,当用户单击复选框时,表单将使用提醒ID提交,并且你的视图可以相应地更新提醒对象.首先你需要更新你的视图函数

if remindercheck_form.is_bound:
    reminder_id = request.POST.get("reminder_id") 
    reminder = get_object_or_404(Reminders, id=reminder_id)
    reminder.status = "Closed" 
    reminder.save()

您还需要将get_object_or_400导入为

from django.shortcuts import get_object_or_404

并在html模板中添加如下输入字段

<input type="hidden" name="reminder_id" value="{{ reminder.id }}">

这将解决您的问题,并使其工作....谢谢给予一个upvote请:)

js5cn81o

js5cn81o3#

对您关于提醒结束的问题的答复
因为我认为你已经得到了remember_id,现在使用这个remember_id来删除/关闭正确的提醒。修改后的代码如下所示

if remindercheck_form.is_bound:
        note = request.POST("note")
        reminder = Reminders.objects.filter(note=note, id=reminder_id)
        reminder.update(status="Closed")

我想这会像你需要的那样工作

相关问题