为了账号安全,请及时绑定邮箱和手机立即绑定

Django 使用模型形式更新模型实例

Django 使用模型形式更新模型实例

三国纷争 2023-04-25 15:59:50
我在 Django 中有以下模型,用于存储有关药物的数据。class Medicine(models.Model):    Medicine_Name = models.CharField(max_length=100)    User_Associated = models.ForeignKey(User, on_delete=models.CASCADE)    Tablets_In_Box = models.IntegerField()    Dose_in_mg = models.IntegerField()    Dose_Tablets = models.IntegerField()    Number_Of_Boxes = models.IntegerField()    Last_Collected = models.DateField()    def __str__(self):        return self.Medicine_Name        def get_absolute_url(self):        return reverse('tracker-home')我正在尝试创建一个模型表单,用户可以在其中更新他们的一种药物的最后一个集合。这是我开始的。class CollectionForm(forms.ModelForm):    class Meta:        model = Medicine        fields = ['Medicine_Name', 'Number_Of_Boxes', 'Last_Collected']我不明白如何根据现场的“Medicine_Name”调用我的模型实例。换句话说,我需要用户能够从下拉菜单中选择正确的药物,然后表单必须更新我的药物模型上的“Last_Collected”和“Numer_Of_Boxes”字段。https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#the-save-method这似乎包含相关信息,但我很难了解如何在这种情况下使用它。如何根据表单中的用户输入正确获取我需要的药物表单实例?此外,如何在我的视图中使用 save 方法来确保数据库得到正确更新?编辑为表单添加了视图:def update(request, pk):        instance = Medicine.objects.get(id=pk)    if request.method == 'POST':        form = CollectionForm(user=request.user, instance=instance, data=request.POST)                if form.is_valid():            instance = form.save(commit=False)            instance.User_Associated = request.user            instance.save()    else:        form = CollectionForm()     context = {'form': form}    return render(request, 'tracker/medicine_collection.html', context )
查看完整描述

2 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

观点:


def update(request, pk):

    instance = Medicine.objects.get(id=pk)


    if request.method == 'POST':

        form = CollectionForm(instance=instance, data=request.POST)

        if form.is_valid():

            instance = form.save(commit=False)

            instance.User_Associated = request.user

            instance.save()

        return redirect ('/')

        ....


查看完整回答
反对 回复 2023-04-25
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

尝试了一种不同的方法(基于类的视图 - UpdateView)我刚刚在 SO 上学到了这里。没有测试它,但我认为它是朝着正确方向迈出的一步。


class UpdateMedicine(LoginRequiredMixin, UpdateView):

    model = Medicine  #call the model you need to update

    fields = ['Medicine_Name', 'Number_Of_Boxes', 'Last_Collected'] #specify the fields you need to update

    template_name_suffix = 'medicine_update_form' #specify the template where the update form is living


    def get_context_data(self, **kwargs):

        context = super().get_context_data(**kwargs)

        context.update(

            user=self.request.user, #get the current logged in user

            instance=get_object_or_404(Medicine, pk=self.kwargs['pk']) #get the pk of the instance

        )

        return context


    def form_valid(self, form):

        form.instance.medicine = get_object_or_404(Medicine, slug=self.kwargs['pk'])

        return super().form_valid(form) #saves the updates to the instance 


    def get_success_url(self):

        return reverse('medicine-collection') #name of the url where your 'tracker/medicine_collection.html is living

将适当的模板和 url 链接到上面的示例并自己尝试一些事情。


查看完整回答
反对 回复 2023-04-25
?
HUWWW

TA贡献1874条经验 获得超12个赞

这是基于更新特定用户的实例。本教程帮助我实现了同样的目标。

https://youtu.be/EX6Tt-ZW0so


查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信