【问题标题】:Saving data without using form in Django在 Django 中不使用表单保存数据
【发布时间】:2022-10-23 22:32:24
【问题描述】:

我有一个应用程序需要在不使用表单的情况下保存数据。该场景将是一个潜在的员工储备可用的堵嘴工作机会。问题是没有保存。通过检查管理面板,也没有 reserved_shift。

更新代码


@login_required
def reserve_shift(request, pk):#here employee reserves that offered jobs on job list
    
    shift = Shift.objects.get(id=pk)
    if request.method == 'POST':

        shift.user=request.user
        shift.time_reserved=datetime.datetime.now()
        #shift.user.add(shift.user)
        shift.save()
  
    return redirect('reserved_shifts',{'shift':shift})


#list all reserved shifts by that employee

@login_required  #the view to all shifts that employee reserved
def reversed_shifts(request):
    shifts=Shift.objects.all()
    return render(request,'reserved_shifts.html')

这是从 Shift 类继承的模型


**Updated model**
class Shift(models.Model):

    employer=models.ForeignKey(Employer,on_delete=models.CASCADE)
    pub_date=models.DateTimeField('Date published',auto_now_add=True)
    updated_date = models.DateTimeField(auto_now_add=True,null=True, blank=True)
    address=models.ForeignKey(AddressBook,on_delete=models.CASCADE,related_name="shift_street")
    shift_date=models.DateTimeField('Date')
    start_time = models.TimeField()
    finish_time = models.TimeField()
    published = models.BooleanField(default=False)

    details=models.CharField(max_length=200, blank=True, null=True)
    user=models.ForeignKey(get_user_model(),on_delete=models.CASCADE)
    time_reserved = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'{self.pub_date}'

然后是模板

**shift_detail.html** 

here, by clicking "reserve" button, the shift will be reserved, then redirect to reserved_shifts list view to show all jobs reserved by that person.

{% if user.is_authenticated %}
  
Hi {{ user.first_name }}!

<li>organization name: {{shift.employer}}</li>
<li>shift id is: {{shift.id}}</li>
<li> shift_employer_id:{{shift.employer_id}}</li>
<li>shift date: {{shift.shift_date}}</li>
<li>shift start time: {{shift.start_time}}</li>
<li>shift finish time:{{shift.finish_time}}</li>
<li>shift details: {{shift.details}}</li>
<li>organiztion address: {{shift.address}}</li>
<td><a class="btn btn-sm btn-success" href="{% url 'reserved_shifts'%}">reserve</a></td>

{% endif %}

**reserved_shifts.html**

{% if reserved_shifts %}

    <ul>
    {% for shift in reserved_shifts %}
            <li>organization name: {{shift.employer}}</li>  
            <li>shift id is: {{shift.id}}</li>
            <li> shift_employer_id:{{shift.employer_id}}</li>
            <li>shift date: {{shift.shift_date}}</li>
            <li>shift start time: {{shift.start_time}}</li>
            <li>shift finish time:{{shift.finish_time}}</li>
            <li>shift details: {{shift.details}}</li>
            <li>organiztion address: {{shift.address}}</li>
    
     {% endfor %}
    <ul>
{% else %}

 <p> No shift is available</p>

{% endif %}

然后我的网址:

**here I actually don't need reserve_shift template, as the reserve button is in shift_detail page, if succeeded, it will redirect to reserved_shifts page.** 
path('shifts/<int:shift_id>/',views.shift_detail,name="shift_detail"),
path('reserved_shifts', views.reversed_shifts, name="reserved_shifts"),
path('reserve_shift/', views.reserve_shift, name="reserve_shift"),

迁移了对模型的更改。单击“保留”按钮后,它被重定向到显示“没有班次可用”的 reserved_shifts 页面。

【问题讨论】:

  • 您的代码提供了对问题的不完整视图
  • @Blye 会有太多代码。我知道问题与该视图或模型有关。根据您的 cmets,我添加了 Shift 类:)

标签: python django


【解决方案1】:

好的,所以您的问题是您正在尝试保存一个您从未在 reserve_shift 方法中初始化的对象。您需要创建并初始化一个具有您检索到的shift 对象属性的reserved_shift 对象,或者您可以执行其他操作。

我建议不要考虑为保留班次和通用班次设置单独的模型,因为至少在这个小例子中,它比解决方案引入了更多的问题。

要重构代码,您只需将 ShiftReserved 的两个属性移动到 Shift 模型中并启用 null 以便它们可以为空以用于未保留的班次。

class Shift(models.Model):

    employer=models.ForeignKey(Employer,on_delete=models.CASCADE)
    pub_date=models.DateTimeField('Date published',auto_now_add=True)
    updated_date = models.DateTimeField(auto_now_add=True,null=True, blank=True)
    address=models.ForeignKey(AddressBook,on_delete=models.CASCADE,related_name="shift_street")
    shift_date=models.DateTimeField('Date')
    start_time = models.TimeField()
    finish_time = models.TimeField()
    published = models.BooleanField(default=False)

    details=models.CharField(max_length=200, blank=True, null=True)

    user=models.ForeignKey(get_user_model(),on_delete=models.CASCADE, blank=True, null=True)
    time_reserved = models.DateTimeField(auto_now_add=True, blank=True, null=True)

    def __str__(self):
        return f'{self.pub_date}'

这意味着views.py 的以下代码应该可以工作。请记住相应地重构保留的班次视图!

@login_required #here employee reserves that offered jobs on job list
def reserve_shift(request, pk):
    
    shift = Shift.objects.get(id=pk)
    if request.method == 'POST':
        shift.user = request.user
        shift.time_reserved = datetime.datetime.now()
        shift.save()
    return redirect('reserved_shifts')

【讨论】:

  • 非常感谢您的建议。数据似乎仍未保存。我需要稍后再与您联系并尝试找出问题所在。谢谢 :)
  • 在尝试在列表中检索它们之前,您首先需要在少于一个对象 Shift 处创建...没有保存任何内容,因为到目前为止没有创建任何要保存的内容。你想在哪里创建你的 Shift 对象?创建它并保存它,它将出现在列表中。
  • @trans您可能忘记在运行站点之前进行迁移
  • @Blye,我已经更新了我的代码并迁移了模型中的更改。另请查看我的模板和网址。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 2015-12-02
  • 2022-01-25
  • 2021-01-27
  • 2021-06-05
  • 2021-08-25
  • 1970-01-01
相关资源
最近更新 更多