장고 양식과 관련하여 매우 이상한 문제가 있습니다. 사용자가 외래 키 관계에 대한 데이터를 동시에 제출할 수 있도록 추가 formset을 포함하는 양식을 표시합니다.Django 양식은 두 번째 요청 후에 만 유효합니다.
템플릿은 항상 원래 모델의 양식과 두 번째 모델의 양식을 표시합니다.
두 번째 양식을 작성하지 않고 두 양식을 제출하고 싶습니다. 첫 번째 제출시 seond 양식의 유효성을 검사하지 않고 페이지를 다시 표시하지만 두 번째 제출시 두 번째 양식은 유효합니다! 그렇더라도 POST 데이터는 동일합니다. 어떻게 가능합니까?
어쩌면 내가 완전히 잘못하고있는 중입니다. 사용자가 formset에서 아무 것도 기입하지 않았거나 무언가를 잘못 입력 한 경우 어떻게 분별할 수 있습니까? 여기
모델 :
class Software(models.Model):
creation_date = models.DateTimeField(default=datetime.now)
creator = models.ForeignKey(User)
version = models.CharField(max_length=300, unique=True, editable=False)
major_version = models.IntegerField()
minor_version = models.IntegerField()
[...]
def save(self, **kwargs):
"""
This updates the version string to the combined representation.
"""
self.version = Software.combine_version_string (self.major_version, self.minor_version)
super(Software, self).save(**kwargs)
class SoftwarePatch(models.Model):
file = models.FileField(upload_to='software_patches')
file_name = models.CharField(max_length=255, editable=False)
file_date = models.DateTimeField(default=datetime.now)
upload_date = models.DateTimeField(default=datetime.now)
software = models.ForeignKey('Software', related_name='patches')
firmware_patch = models.BooleanField(default=True)
target_path = models.CharField(max_length=255, blank=True)
class Meta:
unique_together = ('software', 'file_name')
verbose_name_plural = "software patches"
def __unicode__(self):
return self.file_name
def clean(self):
if self.file and not self.file_name:
self.file_name = self.file.file.name
여기
내 양식 :
SoftwarePatchFormSet = inlineformset_factory(Software,
SoftwarePatch,
extra=1)
class SoftwareForm(forms.ModelForm):
"""
A simple form for creating a new software.
"""
class Meta:
model = Software
그리고 마지막으로 내보기 기능 : 모든
def software_add(request, software_id=None):
if software_id == None:
software = Software()
else:
software = Software.objects.get(id=software_id)
if request.POST:
form = SoftwareForm(request.POST, instance=software)
if form.is_valid():
software = form.save(commit=False)
softwarepatch_formset = SoftwarePatchFormSet(request.POST, request.FILES, instance=software)
if softwarepatch_formset.is_valid():
software = form.save()
softwarepatch_formset.save()
# Redirect, in case of a popup close it
if request.POST.has_key("_popup"):
pk_value = software._get_pk_val()
return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script>' % \
# escape() calls force_unicode.
(escape(pk_value), escape(software)))
if 'next' in request.POST:
return HttpResponseRedirect(request.POST['next'])
else:
return HttpResponseRedirect(reverse('index'))
else:
form = SoftwareForm(instance=software)
softwarepatch_formset = SoftwarePatchFormSet(instance=software)
is_popup = request.GET.has_key("_popup") or request.POST.has_key("_popup")
return render_to_response(
'main/software_edit.html',
{'form': form,
'softwarepatch_formset': softwarepatch_formset,
'add': True,
'is_popup': is_popup,
},
context_instance = RequestContext(request)
)
'auto_add' 또는'auto_now_add' [https://docs.djangoproject.com/en/dev/ref/models/fields/#datefield]를 추가 할 수 있습니다. 그러나 필드는 admin 또는'ModelForm'에 의해 자동 생성 된 폼에 표시되지 않습니다. 그렇지 않으면 기본값을 제거하고 사용자가 값을 입력하지 않으면 view의'request.POST [ "field_date"]'를 설정하십시오 [softwarepatch_formset = SoftwarePatchFormSet (request.POST, request.FILES, instance = software)]의 앞에 –
지금 설명 된대로 문제를 발견 한 이후로 여기에 내 대답을 수락하십시오. 문제가되는 datetime.now 문에 대해 별도의 질문을 추가했습니다. http://stackoverflow.com/questions/7836005/django-datetimefield-has-problems-with-datetime-now – Fabian