我為我的Meeting模型覆寫了一個保存方法,它將在用戶創建會議時為meeting_ID生成一個隨機id。
保存方法本身是成功的,但問題是,不知何故,覆寫的save()方法為創建的會議生成了兩個隨機ID,而不是只有一個。也就是說,當我點擊 "保存 "按鈕時,它將創建兩個相同的會議,其meeting_ID不同。
我不知道這到底是什么?
我不知道問題出在哪里,因為我是一個Django的初學者。
請提前感謝。
Model.py
class Meeting(models.Model)。
meeting_status = (
('Coming Soon', 'Coming Soon') 。
('Live', 'Live') 。
('Closed', 'Closed')
)
meeting_ID = models. CharField(primary_key=True, max_length=6, validators=[RegexValidator(r'^d{6,6}$')], null=True)
meeting_title = models.CharField(max_length=400, null=True)
meeting_date = models.DateField()
meeting_time = models.TimeField()
meeting_desc = models.CharField(max_length=500, null=True)
meeting_status = models.CharField(max_length=200, null=True, choices=MEETING_STATUS)
date_created = models.DateTimeField(default=timezone.now, null=True)
def __str__(self):
return self.meeting_ID
def save(self, *args, **kwargs)。
meetingID = random.randint(100000,999999)
if not Meeting.objects.filter(meeting_ID=str(meetingID)).existence()
self.meeting_ID = str(meetingID)
print(self.meeting_ID)
super(Meeting, self).save(*args,**kwargs)
class Resolutions_Meeting(models.Model)。
reso_ID = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
resolution = models.CharField(max_length=400)
meeting_id = models.ForeignKey(Meeting, related_name="has_meetings", on_delete=CASCADE, null=False)
def __str__(self):
return str(self.meeting_id)
Views.py
class MeetingsCreate(CreateView)。
模型 = 會議
模板名稱 = 'means/create_meetings.html': 模型 = 會議
# fields = ['meeting_ID', 'meeting_title', 'meeting_date', 'meeting_time', 'meeting_desc', 'meeting_status']/span>
form_class = MeetingForm
success_url = None
def get_context_data(self, **kwargs)。
data = super(MeetingsCreate, self).get_context_data(**kwargs)
if self.request.POST。
data['meansings'] = ResolutionsFormSet(self.request.POST)
else:
data['meets'] = ResolutionsFormSet()
return data
def form_valid(self, form)。
背景關系 = self.get_context_data()
meetings = context['meansings']
with transaction.atomic()。
self.object = form.save()
# print(self.object).
if meetings.is_valid()。
meetings.instance = self.object
meetings.save()
return super(MeetingsCreate, self).form_valid(form)
def get_success_url(self)。
return reverse_lazy('host_dashboard' /span>)
**Template/formset.html**
````。
{% load static %}
<html>
<head>
<style type="text/css"/span>>
.delete-row {
align-self: center;
}
</style>
</head>
<body>
{%加載crispy_forms_tags %}
<table class="col-md-9" style="margin-left: 10px;" /span>>
{{ formset.management_form|crispy }}}.
{% for form in formset.forms %}}。
<tr class="{% cycle 'row1' 'row2' %} formset_row-{{ formset.prefix }}">
{% for field in form.visible_fields %}}
<td>
{#包括表單中的隱藏欄位#}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}{{ hidden }}.
{{隱藏的}}
{% endfor %}{% endif %}
{% endif %}{% endif %}
{{ field.errors.as_ul }} {{ field|as_crisis}.
{{field|as_crispy_field }}}
</td>
{% endfor %} {{field.error.as_ul }} {field|as_crispy_field }} {% endfor %}
</tr>
{% endfor %} {% endfor %}
</table>
<br>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"/span>>
</script>
<script src="{% static 'js/jquery.formset.js' %}">
</script>
<腳本 type="text/javascript">
$('.formset_row-{{ formset.prefix }}').formset({
addText: 'add another resolution',
洗掉文本。'移除'。
前綴。'{{ formset.prefix }}'。
});
</script>
</body>
</html>
```
**template/create_meeting.html**
````。
{% extends 'meetings/main.html' %}
{%加載static %}
{%加載crispy_forms_tags %}
<html>
<head>
</head>
<body>
{% block content %}
<div class="container"/span>>
<div class="Card">
<div class="card-header">
創建會議
</div>
<div class="card-body">
{%脆皮形式%}
</div>
</div>
</div>
{% endblock %}}
</body>
</html>
```
uj5u.com熱心網友回復:
你的form_valid()方法似乎不對。顯然,你使用了save()方法兩次,所以這就是你創建兩個實體的原因。第一個save()方法應該是
form.save(commit=False)
所以你不會在資料庫上創建一個實體。這就是commit = False的作用。它很有用,因為你可以在用戶發布表單后對資料進行操作。然后你可以使用第二個save()方法來創建資料庫中的實體。但我認為你只想驗證表單的資料。
現在,我無法測驗你的代碼,但我認為它一定是這樣的:
def form_valid(self, form)。
背景關系 = self.get_context_data()
meetings = context['meansings']
if meetings.is_valid()。
response = super().form_valid(form)
meetings.instance = self.object。
meetings.save()
return回應
else:
return super().form_invalid(form)
如果不能作業,那么除了我提到的那個錯誤外,還有另一個錯誤。在這種情況下,我可以編輯我的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/323154.html
標籤:
下一篇:如何格式化一個文本檔案?
