我创建了一个带有字段选择的学生模型。但是,当我保存它时,它不会验证该选择是否在我在模型字段中指定的选择中。
为什么它不会阻止我使用模型中未指定的选项保存新对象?
这是模型:
class Student(models.Model):
year_in_school = models.CharField(
max_length=4,
choices= [
('FRES', 'Freshman'),
('SOPH', 'Sophomore'),
],
)
Run Code Online (Sandbox Code Playgroud)
这是我在 shell 中编写的代码:
>>> from app.models import Student
>>> new_student = Student.objects.create(year_in_school='HACK')
>>> new_student.year_in_school
'HA'
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Django 提供的 modelchoicefield ;但是,它的行为并不符合我的预期。
我希望向最终用户显示的是我的模型中的字符串值(可以工作),但当用户提交表单时返回模型的主键(而不是显示值)。我尝试在 Django 表单上使用 to_field_name="id" ,并且在渲染 HTML 时它确实正确渲染了值,但是当用户提交表单时,我返回的值是显示值,而不是我的主键期待。
customer_edit_form.py
annual_income = forms.ModelChoiceField(label='Annual income', to_field_name="id", queryset=cust_income_range.objects.all(), empty_label='-- None --')
Run Code Online (Sandbox Code Playgroud)
模型.py
# Annual Income Model
class cust_income_range(models.Model):
id = models.IntegerField(primary_key=True)
range = models.CharField(max_length=50)
def __str__(self):
return self.range
Run Code Online (Sandbox Code Playgroud)
客户视图.py
annual_income = form.cleaned_data['annual_income']
Run Code Online (Sandbox Code Playgroud) 我有观察者模型,它通过 OneToOneRelation 扩展用户模型。我对具有观察者外键的模型清单进行了过滤。这是 models.py 代码:
\n\nclass Observer(models.Model):\n user = models.OneToOneField(User, on_delete=models.CASCADE)\n rating = models.IntegerField(default=0)\n bird_ratings = models.ManyToManyField(\'BirdName\', through=\'BirdRatings\')\n\nclass Checklist(gismodels.Model):\n date = models.DateField()\n time_start = models.TimeField(null=True)\n time_end = models.TimeField(null=True)\n site_name = models.CharField(max_length=200)\n municipality = models.CharField(max_length=200)\n observer = models.ForeignKey(Observer, null=True, default=\'\')\n other_observers = models.CharField(max_length=150, default=\'\')\n note = models.CharField(max_length=2000)\n location_note = models.CharField(max_length=2000, default=\'\')\n position = gismodels.PointField(null=True, srid=4326)\n created = models.DateTimeField(db_index=True, null=True)\n rating = models.IntegerField(default=0)\nRun Code Online (Sandbox Code Playgroud)\n\n然后我在filters.py中创建了ChecklistFilter类:
\n\nclass ChecklistFilter(django_filters.FilterSet):\n date = DateFromToRangeFilter(label=\'Datum pozorov\xc3\xa1n\xc3\xad\', widget=RangeWidget(attrs={\'display\': \'inline\'}))\n #groups = django_filters.ModelMultipleChoiceFilter(queryset=User.objects.filter(), widget=forms.CheckboxSelectMultiple)\n created = DateFilter(label=\'Datum …Run Code Online (Sandbox Code Playgroud) django django-models django-forms django-filter modelchoicefield
我试图从下面的模型中显示版本字段,而不是默认的str是 field2_name:
注意:这个 SO 链接Displaying a specific field in a django form可能比我需要的更多,但我不是 100% 确定。我试图实现这一点,但没有成功。
另请注意,我在https://docs.djangoproject.com/en/1.10/ref/forms/fields/尝试了示例,但无法使其正常工作
型号(通用名称):
class CodeVersion(models.Model):
field1= models.ForeignKey(SomeOtherModel, on_delete=models.CASCADE)
field2_name = models.CharField(max_length=256)
field3_description = models.CharField(max_length=1000, blank=True)
version = models.PositiveIntegerField()
def __str__(self):
return self.field2_name
Run Code Online (Sandbox Code Playgroud)
形式:
class VersionsForm(forms.Form):
code_versions = forms.ModelChoiceField(queryset=CodeVersion.objects.none())
def __init__(self, SomeOtherModel_id):
super(VersionsForm, self).__init__()
self.fields['infocode_versions'].queryset = CodeVersion.objects.filter(SomeOtherModel_id=SomeOtherModel_id)
Run Code Online (Sandbox Code Playgroud)
这有效 - 它按预期返回 field2_name 。
我该如何返回版本 - 最简单的方法是什么?
任何帮助或指导表示赞赏。
我想使用forms.ModelChoiceField. 我已经阅读了很多关于这个主题的文档,但事实证明它很难达到预期的结果!
这是我的代码。
我有这个表格:
表格.py
from django import forms
from asset_db.models import Profiles
class SubmitJob(forms.Form):
material_id = forms.CharField(max_length=8)
workflow = forms.ModelChoiceField(queryset=Profiles.objects.distinct('name'))
start_datepicker = forms.CharField(max_length=12)
end_datepicker = forms.CharField(max_length=12)
Run Code Online (Sandbox Code Playgroud)
这个型号:
class Profiles(models.Model):
id = models.DecimalField(6).auto_creation_counter
name = models.CharField(max_length=256, default='null')
target_path = models.CharField(max_length=256, default='null')
target_profile = models.TextField(max_length=1024, default='null')
package_type = models.CharField(max_length=256, default='null')
video_naming_convention = models.CharField(max_length=256, default='null')
image_naming_convention = models.CharField(max_length=256, default='null')
package_naming_convention = models.CharField(max_length=256, default='null')
def __str__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
这是 HTML 输出:
<p><label for="id_workflow">Workflow:</label> <select id="id_workflow" name="workflow" required>
<option value="" selected="selected">---------</option>
<option …Run Code Online (Sandbox Code Playgroud) 我有一个包含外键的模型:
class Part(models.Model):
partType = models.ForeignKey(PartType, on_delete=models.CASCADE)
brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
part_name = models.CharField(max_length=60)
class QuotePart(models.Model):
quote = models.ForeignKey(Quote, on_delete=models.CASCADE)
line = models.PositiveSmallIntegerField(default=1)
partType = models.ForeignKey(PartType, on_delete=models.CASCADE)
# part can be None if the part has not been selected
part = models.ForeignKey(Part, on_delete=models.CASCADE,blank=True,null=True)
Run Code Online (Sandbox Code Playgroud)
我有一个表单,允许将零件添加到报价中,并希望将表单上的选择限制为正确的零件类型,但我的代码不起作用:
class QuoteBikePartForm(ModelForm):
def __init__(self, *args, **kwargs):
super(QuoteBikePartForm, self).__init__(*args, **kwargs)
self.fields['partType'].widget.attrs['disabled'] = True
self.fields['frame_part'].widget.attrs['disabled'] = True
partType = kwargs.pop('partType')
self.fields['part'].queryset = Part.objects.filter(partType=partType.pk)
class Meta:
model = QuotePart
fields = ['quote','line','partType','frame_part', 'part', 'quantity','cost_price', 'sell_price']
QuoteBikePartFormSet = inlineformset_factory(Quote, QuotePart, …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有一个下拉列表(部门),它取决于之前从下拉列表(faculty 字段)中选择的值。我正在使用 ajax 来获取工作正常的新值。但是,当我尝试保存表单时,我得到了选择一个有效的选择。该选择不是可用的选择之一。
这是我的模型
from django.db import models
from system.models import FacultyData, DepartmentData, SessionData, SemesterData, SettingsData
# Create your models here.
class SchoolFees(models.Model):
fid = models.ForeignKey(FacultyData, on_delete= models.SET_NULL, null=True)
did = models.ForeignKey(DepartmentData, on_delete= models.SET_NULL, null=True)
sid = models.ForeignKey(SessionData, on_delete= models.SET_NULL, null=True)
amount = models.CharField(max_length=30)
def __str__(self):
return self.amount
Run Code Online (Sandbox Code Playgroud)
和我的 form.py
from django import forms
from . import models
from system.models import FacultyData, DepartmentData, SessionData
from .models import SchoolFees
class FeesCreationForm(forms.ModelForm):
fid = forms.ModelChoiceField(queryset=FacultyData.objects.all(), empty_label="--Select Faculty--",
widget=forms.Select(attrs={'class': 'form-control'}))
did …Run Code Online (Sandbox Code Playgroud)