我正在嘗試使用其他模型的 ajax 加載資訊提交我的模型表單。對于我的模型表單的 ChoiceField,我收到了這個錯誤;
Select a valid choice. 69 is not one of the available choices.
request.POST 看起來不錯。我得到了我所有的領域。由于我的提醒物件欄位已經是 CharField,我應該能夠將 ['69'] 保存到那里,但我不知道為什么會出現此錯誤?
*** request.POST: <QueryDict: {'csrfmiddlewaretoken': ['dTtWIUKCOytmYVsbGf7StxMmd4ywPd0gzvvraAgrqiLuiUfLv3xo2TD1lv9Xpcxs'], 'topic': ['dsfdsfs'], 'remind_date': ['2022-02-22 13:45:59'], 'reminder_object_type': ['Client'], 'remind_object': ['69'], 'detail': ['<p>fdgfdgfd</p>\r\n'], 'submit_reminder_create_form': ['']}>
模型.py
class Reminder(models.Model):
user_owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reminder_user') # user.reminder_user
topic = models.CharField(max_length=100, blank=True, null=True)
remind_date = models.DateTimeField(blank=True, null=True)
reminder_object_type = models.CharField(max_length=100, blank=True, null=True)
# Client
# Contact
# Action
remind_object = models.CharField(max_length=999, blank=True, null=True)
detail = RichTextField(max_length=999999,blank=True, null=True)
reminder_status = models.CharField(max_length=100, default="Active", blank=True, null=True)
slug = models.SlugField(max_length=200, blank=True, null=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return str(self.topic)
def save(self, *args, **kwargs):
self.slug = slugify(str(self.topic) "-" str(self.user_owner) "-" str(get_random_code()))
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse('reminder-detailview', kwargs={'slug': self.slug})
表格.py
class ReminderModelForm(forms.ModelForm):
class Meta:
model = models.Reminder
fields = ('reminder_object_type', 'topic', 'remind_date', 'remind_object', 'detail')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['reminder_object_type'] = forms.ChoiceField(required=True, label="", widget=forms.RadioSelect(attrs={'class': 'form-check form-control'}), choices=(
("Client", "Client"),
("Contact", "Contact"),
("Action", "Action")
))
self.fields['topic'] = forms.CharField(required=True, max_length=100, label="", widget=forms.TextInput(attrs={'class':'form-control', 'placeholder': 'Topic'}))
self.fields['remind_date'] = forms.DateTimeField(required=True, label="", validators=[validate_greater_than_now], widget=DateTimeWidget(
attrs={'class':'form-control'},
usel10n = True,
bootstrap_version=4
) )
self.fields['remind_object'] = forms.ChoiceField(required=False, label="", widget=forms.Select(attrs={'class': 'form-control'}))
self.fields['detail'] = forms.CharField(required=False, max_length=999999, widget=CKEditorWidget(attrs={'class' : 'form-control'}))
視圖.py
class ReminderListView(generic.ListView):
model = models.Reminder
template_name = 'crm/reminder_list.html'
ordering = ['-created']
def post(self, request, *args, **kwargs):
if 'submit_reminder_create_form' in self.request.POST:
print("*** request.POST: ", request.POST)
reminder_form = forms.ReminderModelForm(self.request.POST, self.request.FILES)
if reminder_form.is_valid():
print("*** request.POST: ", request.POST)
instance = reminder_form.save(commit=False)
instance.user_owner = self.request.user
instance.save()
reminder_form = forms.ReminderModelForm()
messages.success(self.request, f'{instance.topic} created successfully')
return redirect('reminder-detailview', slug=instance.slug)
else:
messages.warning(self.request, 'The form is not valid, please check the form fields properly!')
context = {
'reminder_create_form':forms.ReminderModelForm(self.request.POST, self.request.FILES),
'all_reminders': models.Reminder.objects.all().order_by('-created')
}
return render(request, 'crm/reminder_list.html', context, status=404)
def get_context_data(self, **kwargs):
context = super(ReminderListView, self).get_context_data(**kwargs)
context['all_reminders'] = models.Reminder.objects.all().order_by('-created')
context['sidebar_in'] = 'Reminder'
context['time_is'] = timezone.now()
context['reminder_create_form'] = forms.ReminderModelForm
context['active_reminders'] = models.Reminder.objects.filter(reminder_status = 'Active').filter(remind_date__lte = timezone.now() ).order_by('-created')
return context
html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
{{ reminder_create_form.media }}
<form id="reminder-create-form" method="POST" enctype="multipart/form-data" class="needs-validation"> {% csrf_token %}
{{reminder_create_form|crispy}}
</form>
<!-- jquery -->
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<!-- my custom -->
<script>
// bu js k?sm?; sadece html formuna verilerin istedi?imiz gibi ba?l?-dropdown ?eklinde yüklenmesini sa?l?yor, ama forma kaydetmede forms.py da overwrite etti?imiz init ?al??acak
$(document.getElementById("reminder-create-form").elements["reminder_object_type"]).change(function () {
var selectedValue = $(this).val();
$.ajax({
url: "{% url 'ajax_reminder_type_view' %}",
data: { 'gonderilen_kelime': selectedValue, },
success: function (data) {
$(document.getElementById("reminder-create-form").elements["remind_object"]).html(data);
}
});
});
</script>
ajax_loading.html
{% for i in aranacak_objeler %}
<option value="{{ i.pk }}">
{% if i.name %}
{{ i.name }} {% if i.client_owner %} - Client: {{i.client_owner}} {% endif %}
{% else %}
{{ i.topic }} - Client: {{i.client_owner}} - Created: {{i.created|date:"F d, Y"}}
{% endif %}
</option>
{% endfor %}
uj5u.com熱心網友回復:
在通過 to_python 或 django.form.Field 類的 validate 方法進行表單驗證的程序中發生錯誤。您正在做的是將無效值傳遞給您的欄位。無效值可能不在選擇串列或元組中,但如果您確定該值在選擇串列中,只需檢查該欄位及其小部件。
用于欄位驗證的值嚴格取決于小部件指定的輸入格式。如果您將 forms.RadioSelect 用于該欄位的小部件,則該小部件將一個字串值傳遞給該欄位,而 forms.CheckboxSelectMultiple 小部件傳遞一個列出的值,例如 ['apple', 'orange', ...]。問題是每個欄位都有自己可接受的資料型別進行驗證。例如,MultipleChoiceField 只接受串列或元組,而 ChoiceField 只接受字串。也許在欄位的小部件中指定的值型別(用于驗證的值型別)和欄位期望的值型別之間可能存在沖突。也許您想在傳遞給單元素串列值(或相反)時為 CharField 保存一個字串值?
您可以在此處檢查特定欄位可接受的資料型別。https://github.com/django/django/blob/737542390af27616d93f86cd418e2d7f3e874b27/django/forms/fields.py
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/429456.html
